一、文件存储
TXT文件存储
打开方式
模式 | 说明 |
---|---|
r | 以只读模式打开文件。文件的指针将会放在文件开头。这是默认模式 |
rb | 以二进制只读方式打开文件。文件的指针会放在文件开头。 |
r+ | 以读写方式打开文件。文件的指针将会放在文件开头。 |
rb+ | 以二进制读写方式打开文件。文件指针将会放在文件的开头。 |
w | 以写入的模式打开文件。如果该文件已存在,则将其覆盖。如果该文件不存在则创建新文件。 |
wb | 以二进制写入模式打开文件。如果文件已存在,则将其覆盖。如果该文件不存在,则创建新文件。 |
w+ | 以读写方式打开文件。如果该文件已存在,则将其覆盖。如果该文件不存在,则创建新文件。 |
wb+ | 以二进制读写模式打开文件。如果该文件已存在,则将其覆盖。如果该文件不存在,则创建新文件。 |
a | 以追加方式打开文件。如果该文件已存在,文件指针将会放在文件结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,则创建新文件来写入。 |
ab | 以二进制追加方式打开文件。如果该文件已存在,文件指针将会放在文件结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,则创建新文件来写入。 |
a+ | 以读写方式打开文件。如果该文件已存在,文件指针将会放在文件结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,则创建新文件来读写。 |
ab+ | 以二进制追加方式打开文件。如果该文件已存在,文件指针将会放在文件结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,则创建新文件来读写。 |
简化写法
使用with as语法。在with控制块结束时,文件会自动关闭,所以就不需要在调用close()方法了。
with open('文件名', '模式', encoding='utf-8') as file:
file.write()
JSON文件存储
对象和数组
对象:在JavaScript中是使用花括号{}包裹起来的内容。数据结构为{key1: value1, key2: value2, …}的键值对结 构。在面向对象语言中,key为对象属性,value为对应的值。
数组:在JavaScript中是方括号[ ]包裹起来的内容,数据结构为[“java”, “javascript”, “vb”, …]的索引结构。
[{
"name": "Bob",
"gender": "male",
"birthday": "1992-10-18"
},{
"name": "Selina",
"gender": "female",
"birthday": "1995-10-18"
}]
由中括号包围的就是相当于列表类型,列表中的每个元素可以是任意类型,这个例子中它是字典类型,由大括号包围。
JSON可以是以上两种形式自由组合而成,可以无限次嵌套,结构清晰,是数据交换的极佳方式。
读取JSON
Python提供了JSON库来实现JSON文件的读写操作,可以调用JSON库的loads()方法将JSON文本字符串转换为JSON对象,可以通过dumps()方法将JSON对象转为文本字符串。
import json
str_ = '''
[{
"name": "Bob",
"gender": "male",
"birthday": "1992-10-18"
},{
"name": "Selina",
"gender": "female",
"birthday": "1995-10-18"
}]
'''
print(type(str_))
data = json.loads(str_)
print(data)
print(type(data))
'''
结果:
<class 'str'>
[{'name': 'Bob', 'gender': 'male', 'birthday': '1992-10-18'}, {'name': 'Selina', 'gender': 'female', 'birthday': '1995-10-18'}]
<class 'list'>
'''
使用loads()方法将字符串转为JSON对象,由于最外层是中括号,所以最终的类型是列表类型。
可以使用索引来获取对应内容:
data[0]["name"]
data[0].get('name')
'''
Bob
Bob
'''
通过中括号加0索引,可以得到第一个字典元素,然后再调用其键名即可得到相应的键值。获取键值时有两种方式,一种是中括号加键名,另一种是通过get()方法传入键名,get()方法如果键名不存在则返回None
get()方法,还可以传入第二个参数:
data[0].get('age')
data[0].get('age', 25)
'''
结果:
None
25
'''
在原字典中该键名不存在,此时默认会返回None。如果传入第二个参数,那么在不存在的情况下返回改默认值。
注意:JSON数据需要用双引号来包围,不能使用单引号。若是一下情况则会报错:
import json
str_ = '''
[{
'name': 'Bob',
'gender': 'male',
'birthday': '1992-10-18'
},{
'name': 'Selina',
'gender': 'female',
'birthday': '1995-10-18'
}]
'''
data = json.loads(str_)
'''
结果:
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes:
'''
从JSON文本中读取内容:
从data.json文本文件中读取。其内容是刚刚定义的JSON字符串,可以先将文本文件内容读取出来,然后再使用loads()方法进行转化:
import json
with open('data.json', 'r') as file:
str_ = file.read()
data = json.loads(str_)
print(data)
输入JSON
调用dumps()方法将JSON对象转化为字符串格式。
将字符串,以json格式写入文本文件中:
import json
str_ = '''
[{
"name": "Bob",
"gender": "male",
"birthday": "1992-10-18"
},{
"name": "Selina",
"gender": "female",
"birthday": "1995-10-18"
}]
'''
with open('data.json', 'w', encoding='utf-8') as file:
file.write(json.dumps(str_))
另外,如果想保存JSON的格式,可以在家一个参数indent,代表缩进字符个数。示例如下:
with open('data.json', 'w', encoding='utf-8') as file:
file.write(json.dumps(str_, indent=2))
另外,如果内容中包含中文,中文字符默认会变成Unicode字符,如果不想转为Unicode字符则需要使用ensure_ascii为False.
with open('data.json', 'w', encoding='utf-8') as file:
file.write(json.dumps(str_, indent=4, ensure_ascii=False))
CSV文件存储
写入
列表写入
import csv
with open('data.csv', 'w', encoding='utf-8') as csv_file:
writer = csv.writer(csv_file)
writer.writerow(['id', 'name', 'age'])
writer.writerow(['10001', 'Mike', '20'])
writer.writerow(['10002', 'Bob', '22'])
writer.writerow(['10003', 'Jordan', '21'])
首先打开data.csv文件,模式为w(写入),获得文件句柄。
然后使用CSV的writer方法初始化写入对象。
然后调用writerow()方法,传入每行数据,列表形式。
列与列之间默认是逗号分隔,如果想修改分隔可以使用dellimiter参数
import csv
with open('data.csv', 'w', encoding='utf-8') as csv_file:
writer = csv.writer(csv_file, delimiter=' ')
writer.writerow(['id', 'name', 'age'])
writer.writerow(['10001', 'Mike', '20'])
writer.writerow(['10002', 'Bob', '22'])
writer.writerow(['10003', 'Jordan', '21'])
同时写入多行可以使用writerows()方法:
import csv
with open('data.csv', 'w', encoding='utf-8') as csv_file:
writer = csv.writer(csv_file, delimiter=' ')
writer.writerow(['id', 'name', 'age'])
writer.writerows([['10001', 'Mike', '20'], ['10002', 'Bob', '22'], ['10003', 'Jordan', '21']])
writerows()方法传入,一个列表,列表里面每行数据还是一个列表。
字典写入
import csv
with open('data.csv', 'w', encoding='utf-8') as csv_file:
filednames = ['id', 'name', 'age']
writer = csv.DictWriter(csv_file, fieldnames=filednames)
writer