文件处理
处理文件的几种模式
在Python中,open() 函数可以接受一个参数来指定文件的打开模式。以下是一些常见的文件处理模式:
"r":读取模式(默认)。在这种模式下,文件只能被读取,如果文件不存在则会引发异常。
"w":写入模式。在这种模式下,如果文件存在,会被覆盖;如果文件不存在,则会创建一个新文件。
"a":追加模式。在这种模式下,文件如果存在,则写入的内容会被追加到文件末尾;如果文件不存在,则会创建一个新文件进行写入。
"b":二进制模式。在这种模式下,文件将以二进制模式进行操作,适用于非文本文件(如图片、视频等)的读写。
"r+":读写模式。在这种模式下,文件可以同时被读取和写入。
"w+":读写模式。在这种模式下,文件可以被读取和写入,如果文件存在,则会被覆盖;如果文件不存在,则会创建一个新文件。
"a+":读写模式。在这种模式下,文件可以被读取和写入,写入的内容会被追加到文件末尾;如果文件不存在,则会创建一个新文件。如果想读到内容,先要把文件指针移动到最前面,即seek(0),既想读又想写就用seek和a+
这些模式可以根据需要进行组合,例如"rb"表示以二进制模式读取文件。在使用 open() 函数打开文件时,可以通过传入第二个参数来指定文件的打开模式。例如:
with open('example.txt', 'r') as file:
# 读取文件内容
content = file.read()
文件指针
# 既想读又想写,就用文件指针
with open('test.json','a+',encoding='utf-8') as f:
# 移动文件指针,因为文件指针默认在最后,如果不挪动指针位置,是读不到东西的,这里就填0就ok,证明挪到最前面,不是按照下标走的,输别的数字会报错
f.seek(0)
for line in f:
print(line.strip())
读文件
# 一次性获取文件内容
with open('test.html',encoding='utf-8') as fr:
print(fr.read())
# 逐行读取文件内容--方式1
# 这种方法会逐行迭代文件对象,每次迭代会返回文件中的一行内容作为字符串。这种方式适合处理大文件,因为它一次只读取一行内容到内存中,不会一次性将整个文件加载到内存中。
with open('test.json',encoding='utf-8') as fr1:
for num,line in enumerate(fr1):
print(num,line)
# 逐行读取文件内容--方式2
# 这种方法会一次性将文件的所有内容读取到内存中,并将每一行作为一个字符串存储在列表中。然后你可以通过遍历这个列表来逐行处理文件内容。这种方式适合文件不是很大的情况。
with open('test.json',encoding='utf-8') as fr2:
lines = fr2.readlines()
for num,line in enumerate(lines):
print(num,line)
写文件
with open('test.json','w',encoding='utf-8') as f:
f.write('test') # 可以写入字符串
f.writelines(["Line 1\n", "Line 2\n", "Line 3\n"]) # 可以写入一个字符串列表
说明
因为文件不支持写入除了字符串以外的数据(比如数字、列表、字典等),所以需要将字典或list转成字符串的格式,在写入到文件
将非字符串类型的数据转换为字符串
# 数值转换为字符串
number = 42
string_number = str(number)
# 字典转换为JSON字符串
import json
data = {"key": "value"}
json_string = json.dumps(data)
# 对象序列化为字节字符串
import pickle
obj = {"key": "value"}
pickle_string = pickle.dumps(obj)
json
json就是一个字符串,json必须是双引号,不能是单引号。
字典和字符串互相转换
方式1--json.dumps,json.loads
# 先定义一个字典
d = {
"error":2,
"msg":"无结果" # 会将中文转换成unicode格式存储,如"\u65e0\u7ed3\u679c"
}
# 把字典写到文件中
with open('aa.json','w',encoding='utf-8') as fw:
# fw.write(d) # 报错argument must be str, not dict(参数必须是str,而不是dict)
s = json.dumps(d,ensure_ascii=False,indent=4) # 将字典转换成字符串(只要是文件中的,全都是字符串。文件只支持字符串)
fw.write(s) # 此时即可以写入到文件了
# 把文件中的数据读出来
with open('aa.txt',encoding='utf-8') as fr:
result = fr.read()
dic = json.loads(result) # 将字符串转换成字典
print('刚从文件中读出来的',result)
print('转换之后的',dic)
# 问题:
# 1,写入到文件中时,会将中文转换成unicode格式存储,如"\u65e0\u7ed3\u679c";
# 2,写到文件中,不会换行,不美观,如{'error': 2, 'msg': '无结果'}
# 3,文件中的数据不带颜色
# 解决方式:
# 1,在dumps写入时加上参数ensure_ascii=False即可,如s = json.dumps(d,ensure_ascii=False)
# 2,在dumps写入时加上参数indent=4,可以解决没关的问题
# 3,在创建文件时将.txt改为.josn即可,如open('aa.json','w',encoding='utf-8')
方式2--json.dump,json.load
# 字典转字符串,和字符串转字典,各自分别还有一种写法,这两种方法不需要自己手动的读和写
# 字典转字符串:dump,字符串转字典:load 例:
c = {
"error_code": 0,
"stu_info": [
{
"id": 314,
"name": "矿泉水",
"sex": "男",
"age": 18,
"addr": "北京市昌平区",
"grade": "摩羯座",
"phone": "18317155663",
"gold": 100
},
{
"id": 315,
"name": "矿泉水",
"sex": "女",
"age": 27,
"addr": "上海",
"grade": "摩羯座",
"phone": "18317155664",
"gold": 100
}
]
}
with open('cc.json','w',encoding='utf-8') as fw:
# d是需要操作的字典,fw是需要操作的文件,就直接写进文件中了,不需要自己在wirte一次了
json.dump(c,fw,ensure_ascii=False,indent=4)
with open('cc.json',encoding='utf-8') as fr:
# 直接传文件名即可,也不需要自己在read一次了
result = json.load(fr)
print(result)