文件存储

文件存储

1.TXT文本存储

txt几乎兼容任何平台,方便。但是不利于检索。

保存知乎发现页面的最新专题信息。

import requests
from pyquery import PyQuery as pq
url="https://zhihu.com/explore"
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36'
}
html=requests.get(url,headers=headers).text
doc=pq(html)
items1=doc('.ExploreHomePage-specials .ExploreSpecialCard').items()
L=[]
i=0
for item1 in items1:
    title1=item1.find('.ExploreSpecialCard-info .ExploreSpecialCard-title').text()
    print(title1)
    print('-'*50)
    items2=item1.find('.ExploreSpecialCard-contentList .ExploreSpecialCard-contentTitle').items()
    for item2 in items2:
        L.append(item2.text())
        print(item2.text())
    print('='*50)
    file=open('explore.txt','a',encoding='utf-8')
    file.write('\n'.join([title1,L[i],L[i+1],L[i+2]]))
    file.write('\n'+'='*50+'\n')
    file.close()
    i+=3

explore.txt

中超大结局,广州恒大豪夺第八冠
力压国安,恒大夺取中超冠军
归化球员初登中超赛场
天海门将张鹭醉驾被抓
==================================================
向时间开杠,抗老当然有正确答案
当我们讨论抗老时,到底在讨论什么?
如何抗衰老?
肌肤抗老的原理究竟是什么?
==================================================
向上生活,渐入「家」境
向上生活,2020 自如新产品发布会
能否用一百字写清楚你最想要的生活?
拥有哪些好物,可以提高幸福感?
==================================================
当「猝死」离我们越来越近
艺人高以翔在录制节目时突发心源性猝死
心源性猝死:毫无征兆的死亡威胁?
我看起来完全正常,会不会猝死?
==================================================

打开方式

r: 只读方式打开。文件的指针在文件的开头。默认

rb:以二进制打开一个文件。文件的指针放在文件开头。

r+:以读写方式打开一·个文件。文件指针放在文件的开头。

rb+: 以二进制读写方式打开一个文件。文件的指针放在文件的开头。

w: 以写入的方式打卡一个文件。如果该文件已存在,将其覆盖。不存在,就创建。

wb: 以二进制写入方式打开一个文件。如果该文件存在,将其覆盖。不存在,就创建。

w+:以读写方式打开一个文件。已存在,覆盖。不存在,创建。

wb+: 以二进制读写格式打开文件。已存在,覆盖。不存在,创建。

a: 以追加方式打开一个文件。已存在,文件指针放在文件结尾。新的内容放在已有内容之后。不存在,创建新文件来写入。

ab: 以二进制追加方式打开一个文件。已存在,文件指针放在文件结尾。新的内容放在已有内容之后。不存在,创建新文件来写入。

a+: 以读写方式打开一个文件。已存在,文件指针放在文件结尾。文件打开时会是追加模式。不存在,创建新文件来读写。

ab+:以二进制追加方式打开一个文件。已存在,文件指针放在文件结尾。新的内容放在已有内容之后。不存在,创建新文件来写入。

简化写法

with open ('explore.txt','a',encoding='utf-8' as file):
    file.write('\n'.join([title1,L[i],L[i+1],L[i+2]]))
    file.write('\n'+'='*50+'\n')
2.JSON文件存储

​ json即javascript object Notation,javascript对象标记,通过对象和数组的组合来表示数据,是一种轻量级的数据交换格式。

  • 对象和数组

    JavaScript语言中,一切皆对象。 任何支持的类型都可以通过JSON来表示,例如字符串,数字,对象,数组等。

    对象:JavaScript中使用{}包裹起来的内容。{key1:value1,key2,value2,…}的键值对结构。key为对象的属性,value为对应的值。

    数组:JavaScript用[]包裹起来的内容。

    一个json对象可以写为如下形式:

    [{

    ​ ‘name’:’Tom’,

    ​ ‘sex’:’male’,

    ​ ‘age’:’23’

    },{

    ​ ‘name’:’Mary’,

    ​ ‘sex’:’female’,

    ​ ‘age’:’20’

    }]

    []包起来的相当于列表类型,列表的每个元素可以是任意类型,这个案例中它是字典类型,用{}包围。

  • 读取json

    python提供了json库来实现json文件的读写操作,利用json库的loads()方法将json文本字符串转为json对象,通过dumps()方法将json对象转为文字字符串。

    json的数据需要用双引号来包围,否则报错。

    import json
    str1='[{"name": "Tom","gender": "male","age": "23"},{"name": "Mary","gender": "female","age": "20"}]'
    print(type(str1))
    data=json.loads(str1)#使用loads()方法将字串串转为json对象
    print(data)
    print(type(data))
    print(data[0]['name'])#通过索引来获取对应的内容
    '''
    运行结果:
    <class 'str'>
    [{'name': 'Tom', 'gender': 'male', 'age': '23'}, {'name': 'Mary', 'gender': 'female', 'age': '20'}]
    <class 'list'>
    '''

    从json文本中读取内容。

    with open('data.json','r') as f:
        str1=f.read()
        data=json.loads(str1)#使用loads()方法将字串串转为json对象
        print(data)
        print(type(data))
        print(data[0]['name'])#通过索引来获取对应的内容
  • 输出json

    调用dumps()将json对象转化为字符串。

    data=[{
        'name':'Tom',
        'sex':'male'
    }]
    with open('data.json','w') as f:
        f.write(json.dumps(data))#调用dumps()将json对象转为字符串
    '''
    [{"name": "Tom", "sex": "male"}]
    '''
    #保存为json的格式
    with open('data.json','w') as f:
        f.write(json.dumps(data,indent=2))#加参数indent,代表缩进的字符个数
    '''
    [
      {
        "name": "Tom",
        "sex": "male"
      }
    ]
    '''
    #json中包含中文字符
    data=[{
        'name':'小明',
        'sex':'男'
    }]
    with open('data.json','w') as f:
        f.write(json.dumps(data,indent=2,ensure_ascii=False))
3.CSV文件存储

CSV,全称Comma-Separated Values ,中文名称逗号分隔值或字符分隔值,其文件以纯文本形式存储表格数据。

  • 写入

    import csv
    
    with open('data.csv','w') as csvfile:#打开data.csv文件,打开模式为w,获得文件句柄
        writer=csv.writer(csvfile)#调用csv的writer()方法初始化写入对象,传入句柄
        writer.writerow(['id','name','age'])
        writer.writerow(['1001','Mary','23'])
        writer.writerow(['1002','Mike','32'])
        writer.writerow(['1003','Tom','45'])
    '''
    id,name,age
    
    1001,Mary,23
    
    1002,Mike,32
    
    1003,Tom,45
    '''

    修改列之间的分隔符

    writer=csv.writer(csvfile,delimiter=' ')#此时为空格分隔

    调用writerrows()方法同时写入多行,此时的参数为二维列表

    with open('data.csv','w') as f:
        writer=csv.writer(f,delimiter=' ')
        writer.writerow(['id','name','age'])
        writer.writerows([['1001','Mike',20],['1003','Tom',45],['1002','Mike',32]])
    '''
    id name age
    
    1001 Mike 20
    
    1003 Tom 45
    
    1002 Mike 32
    '''

    爬取的数据一般是结构化的数据,用字典来表示。在csv库中也提供了字典的写入方法。

    with open('data.csv','w') as f:
        fieldnames=['id','name','age']#定义三个字段,将其传入DictWriter来初始化一个字典写入对象
        writer=csv.DictWriter(f,fieldnames=fieldnames)
        writer.writeheader()#先写入头部信息
        writer.writerow({'id':'1001','name':'mary','age':20})#先写入字典
        writer.writerow({'id':'1002','name':'Tom','age':29})
        writer.writerow({'id':'1003','name':'QQ','age':28})
    '''
    id,name,age
    
    1001,mary,20
    
    1002,Tom,29
    
    1003,QQ,28
    
    '''

    写入中文,要给open()参数指定编码格式。

    with open('data.csv','w',encoding='utf-8') as f:
  • 读取

    with open('data.csv','r',encoding='utf-8') as f:
        reader=csv.reader(f)
        for row in reader:
            print(row)

   转载规则


《文件存储》 White Spider 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录