文件存储
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)