Python对文件的操作

141 阅读3分钟

文件的操作模式

with open('文件路径',mode='文件操作模式',encoding='utf-8')as f
    f.read()

1.控制文件读写操作的模式

r(默认的):只读
w:只写
a:只追加写

2.控制文件读写内容的模式

大前提: 
tb模式均不能单独使用,必须与r/w/a之一结合使用 
t(默认的):文本模式 1. 读写文件都是以字符串为单位的 2. 只能针对文本文件 3. 必须指定encoding参数 
b:二进制模式: 1.读写文件都是以bytes/二进制为单位的 2. 可以针对所有文件 3. 一定不能指定encoding参数

读操作

f.read()读取所有内容,执行完该操作后,文件指针会移动到文件末尾 
f.readline() # 读取一行内容,光标移动到第二行首部
f.readlines() # 读取每一行内容,存放于列表中 
强调: f.read()与f.readlines()都是将内容一次性读入内容,如果内容过大会导致内存溢出,若还想将内容全读入内存,则必须分多次读入,有两种实现方式:
方式一 
with open('a.txt',mode='rt',encoding='utf-8') as f: 
    for line in f: print(line) # 同一时刻只读入一行内容到内存中 
方式二
with open('1.mp4',mode='rb') as f: 
    while True: 
        data=f.read(1024) # 同一时刻只读入1024个Bytes到内存中 
        if len(data) == 0: 
            break print(data) 

写操作

f.write('1111\n222\n') # 针对文本模式的写,需要自己写换行符 
f.write('1111\n222\n'.encode('utf-8')) # 针对b模式的写,需要自己写换行符 f.writelines(['333\n','444\n']) # 文件模式 
f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式

主动控制文件内指针移动

#大前提:文件内指针的移动都是Bytes为单位的,唯一例外的是t模式下的read(n),n以字符为单位 
with open('a.txt',mode='rt',encoding='utf-8') as 
    f: data=f.read(3) # 读取3个字符 
with open('a.txt',mode='rb') as f: 
    data=f.read(3) # 读取3个Bytes

# 之前文件内指针的移动都是由读/写操作而被动触发的,若想读取文件某一特定位置的数据,则则需要用f.seek方法主动控制文件内指针的移动,详细用法如下: 
# f.seek(指针移动的字节数,模式控制): 
# 模式控制: 
# 0: 默认的模式,该模式代表指针移动的字节数是以文件开头为参照的 
# 1: 该模式代表指针移动的字节数是以当前所在的位置为参照的 
# 2: 该模式代表指针移动的字节数是以文件末尾的位置为参照的 
# 强调:其中0模式可以在t或者b模式使用,而1跟2模式只能在b模式下用

文件修改方式

# 实现思路:将文件内容发一次性全部读入内存,然后在内存中修改完毕后再覆盖写回原文件 
# 优点: 在文件修改过程中同一份数据只有一份 
# 缺点: 会过多地占用内存 
with open('db.txt',mode='rt',encoding='utf-8') as f: 
    data=f.read()
with open('db.txt',mode='wt',encoding='utf-8') as f: 
    f.write(data.replace('kevin','SB'))

感谢egon老师