1.文件处理
f = open(file="file01.txt", mode="r", encoding="utf-8") #python3默认编码格式为utf-8
data = f.read()
print(data)
print(type(data)) # <class 'str'>
f.close()
如果报错
#UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcc in position 0: invalid continuation byte
说明编码不对。
按正常逻辑来讲,文件是以什么方式存的,就应该用什么方式去读取,比如以gb2312存的,就应该以gb2312去读。文件是以utf-8存的,就用utf-8的编码格式去读。
2.文件处理-二进制模式
文件在计算机中是以二进制存储的,我们可以不理会编码,直接以二进制的形式读取文件内容
f = open(file="file01.txt", mode="rb")
data = f.read()
print(data)
f.close()
以二进制方式读取,mode = "rb"
,得到的结果也是二进制。
在读取视频、图片等内容和网络传输的时候,会使用二进制方式读取。
#打印结果 b'\xef\xbb\xbf\xe7\x94\xb0\xe7\xbb\xb4\xe9\x80\x9a\t12001\t10\r\n\xe5\xbc\xa0\xe5\xae\xb6\xe9\x93\xad\t12002\t11\r\n\xe8\x88\x92\xe5\xa8\x85\t12003\t12\r\n\xe5\xad\x99\xe7\x8e\x89\xe5\x80\xa9\t12004\t13\r\n\xe5\xbc\xa0\xe8\xb6\x85\t12005\t14\r\n\xe7\x8e\x8b\xe4\xba\xac\t12006\t15\r\n\xe5\xbb\x96\xe6\x9e\x97\xe8\x8b\xb1\t12007\t16\r\n\xe5\xbe\x90\xe6\x99\x93\xe8\x8e\x89\t12008\t17\r\n\xe9\x87\x91\xe5\x98\x89\xe7\xa5\xba\t12009\t18\r\n\xe5\x8f\x8a\xe6\xa0\xbc\t12010\t19\r\n\xe4\xba\x8e\xe5\x87\xaf\xe9\x98\xb3\t12011\t20\r\n\xe6\x9d\x8e\xe4\xbf\x8a\xe7\xba\xa2\t12012\t21\r\n\xe5\x88\x98\xe5\x86\xac\t12013\t22\r\n'
3.文件处理-智能检测编码的工具
import chardet
f = open('file01.txt', mode="rb")
data = f.read()
print(chardet.detect(data))
#打印结果:
#{'encoding': 'UTF-8-SIG', 'confidence': 1.0, 'language': ''}
#confidence,表示 encoding 为 UTF-8-SIG 的概率为 1.0
然后,当我们知道目标文件是什么格式后,data.decode("utf-8")
一下,就可以打印出我们需要的内容
4. 循环读取逐条读取文件
f = open('file01.txt', 'r', encoding='utf-8')
for line in f:
print(line, end="") # end = "" 表示,打印的时候以什么结尾,此处可以去掉print默认的换行符 \n
f.close()
打印结果:
# 田维通 12001 10
# 张家铭 12002 11
# 舒娅 12003 12
# 孙玉倩 12004 13
# 张超 12005 14
# 王京 12006 15
# 廖林英 12007 16
# 徐晓莉 12008 17 ...
5.写文件
#以 gbk 格式创建一个文件,写入内容“将进酒”
f = open(file='file02.txt', mode='w', encoding='gbk')
f.write('将进酒')
f.close()
image
如果这个时候再写一遍,即
f = open(file='file02.txt', mode='w', encoding='gbk')
f.write('杯莫停')
f.close()
得到的结果是:将原来的 file02.txt 文件覆盖掉了
6.写文件——追加
写入内容追加的已有内容后面
f = open('file02.txt', 'ab') #mode 为 ab 或 a,表示追加
f.write('\n人生得意须尽欢'.encode('gbk'))
f.close()
image
7.文件处理-读写混合操作文件
f = open('file02.txt', 'r+', encoding='gbk')
data = f.read()
print("content:", data)
f.write("\n锄禾日当午")
f.write("\n汗滴禾下土")
f.write("\n离离原上草")
f.write("\n一岁一枯荣")
f.close()
结果:
image8.文件操作的其他功能
(1)flush()
f = open('f_flush.txt', 'w', encoding='utf-8')
f.write('奇门遁甲') # 在f.close() 之前,写入的内容是在内存中的,而且可能此时txt文件里是没有内容的,所以可以加一句 f.flush(),把文件强制从内存buffer里刷新到硬盘
#一般内存里的buffer满了会自动刷新到硬盘,但是使用 f.flush() 可控制强制刷新到硬盘
f.close()
(2)tell() seek()
# 文本内容: hello world!
>>> f = open('file03.txt', 'r', encoding='gbk')
>>> f.tell() #返回当前文件操作光标位置
0
>>> f.seek(1) # 把操作文件的光标移到指定位置
1
>>> f.read()
'ello world!'
注意:tell(), seek()找的都是字节,长度都是按字节算的。另外,每个字符在不同编码格式下所占的字节长度不一样,gbk 一个中文占2个字节,utf-8 一个中文占3个字节
以中文为例:
# 文件内容:技高一筹
>>> f = open("file03.txt",'r',encoding='gbk')
>>> f.read()
'技高一筹'
>>> f.tell()
8
>>> f.seek(0) #把文件光标移动到起点 0
0
>>> f.seek(4) #把文件光标移动到 4,此时,gbk 下,一个汉字占2个字节,此时光标的位置在 技高和一筹之间
4
>>> f.read() # 所以,读取结果为 后两个字
'一筹'
>>>
#-----------------------------------------------------------------------------
>>> f.seek(1) #把文件光标移动到 1,“半个字”,此时读取内容不出问题,因为他只拿到了 技 字的一部分字节,打印会报错
1
>>> f.tell()
1
>>> f.read()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'gbk' codec can't decode byte 0xef in position 6: incomplete
multibyte sequence
(3)seekable() 判断文件是否可进行seek操作,readable() 判断文件是否可读,writable()判断文件是否可写
(4) truncate() 按指定长度截断文件
#文件内容: 技高一筹
>>> f = open("file03.txt",'r+',encoding='gbk')
>>> f.seek(2)
2
>>> f.truncate()
2
>>> f.read() #文件内容 只剩一个 “技” 字
truncate(4)指定长度的话,就从文件开头开始截取指定长度。不指定长度的话,就从当前位置到文件尾部的内容全去掉。
#文件内容: 技高一筹
>>> f = open("file03.txt",'r+',encoding='gbk')
>>> f.tell()
0
>>> f.truncate(4) #文件内容 只剩一个 “技高” 字
9. 实现文件内容的修改
import os
f = open('file05.txt', 'r+', encoding='gbk') #打开file05.txt 文件
f_new = open('file05_new.txt', 'w', encoding='gbk') # 创建一个新文件
old_str = '李四'
new_str = '李云龙'
for line in f:
if old_str in line: #逐行读取
line = line.replace(old_str, new_str) #修改文件中的内容
f_new.write(line) # 逐行读取的内容写到新创建的文件中
f.close()
f_new.close()
os.replace('file05_new.txt', 'file05.txt') # 替换,以达到修改文件内容的目的(window用os.replace()可实现,但是使用os.rename()不可以,会报错,提示 file05.txt 已存在,无法创建)
网友评论