python——文件处理

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'xefxbbxbfxe7x94xb0xe7xbbxb4xe9x80x9a	12001	10
xe5xbcxa0xe5xaexb6xe9x93xad	12002	11
xe8x88x92xe5xa8x85	12003	12
xe5xadx99xe7x8ex89xe5x80xa9	12004	13
xe5xbcxa0xe8xb6x85	12005	14
xe7x8ex8bxe4xbaxac	12006	15
xe5xbbx96xe6x9ex97xe8x8bxb1	12007	16
xe5xbex90xe6x99x93xe8x8ex89	12008	17
xe9x87x91xe5x98x89xe7xa5xba	12009	18
xe5x8fx8axe6xa0xbc	12010	19
xe4xbax8exe5x87xafxe9x98xb3	12011	20
xe6x9dx8exe4xbfx8axe7xbaxa2	12012	21
xe5x88x98xe5x86xac	12013	22
'

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默认的换行符 

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()

如果这个时候再写一遍,即

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('
人生得意须尽欢'.encode('gbk'))
f.close()


7.文件处理-读写混合操作文件

f = open('file02.txt', 'r+', encoding='gbk')
data = f.read()
print("content:", data)
f.write("
锄禾日当午")
f.write("
汗滴禾下土")
f.write("
离离原上草")
f.write("
一岁一枯荣")
f.close()	

结果:


8.文件操作的其他功能

(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 已存在,无法创建)
原文地址:https://www.cnblogs.com/friday69/p/9194606.html