Python之文件操作
文件操作
打开文件的两种方式
-
open('文件名','模式','指定编码')
# 写入文件 fw = open("plf.txt","w",encoding = 'utf-8') fw.write("我正在写入数据到文件中") fw.close() # 读文件 fr = open("plf.txt","r",encoding = 'utf-8') data = fr.read() print("文件内容为:%s"data) fr.close() ''' 总结: 1. 读写文件都需要手动关闭文件,不方便 '''
-
with open('文件名','模式','指定编码') as 文件名:
# 写入文件 with open("plf.txt","w",encoding = 'utf-8') as fw: fw.write("我正在写入数据到文件中") # 读文件 with open("plf.txt","r",encoding = 'utf-8') as fr: data = fr.read() print("文件内容为:%s"%data) # 嵌套写法 with open("plf.txt","r",encoding = 'utf-8') as fr,\ open("file1.txt",'w',encoding = 'utf-8') as fw: for i in fr: fw.write(i) ''' 优点: 1. 读写文件不需要手动关闭,直接由程序自动关闭,在工作中常使用该方法操作文件 '''
操作文件的模式
# 文件plf.txt内容为
'''
文件内容为:Hello World!
咱们都是中国人!
'''
# 读 r
with open("plf.txt","r",encoding = 'utf-8') as fr:
data = fr.read()
print("文件内容为:%s"%data)
'''
文件内容为:Hello World!
咱们都是中国人!
'''
# 写 w
with open("plf.txt","w",encoding = 'utf-8') as fw:
fw.write("我正在写入数据到文件中")
'''
我正在写入数据到文件中
'''
# 追加 a
with open("plf.txt","a",encoding = 'utf-8') as fa:
fa.write("我正在后面追加文件")
'''
我正在写入数据到文件中我正在后面追加文件
'''
# 读写 r+
with open("plf.txt","r+",encoding = 'utf-8') as fr_w:
fr_w.write("Hello World!")
fr_w.write("咱们都是中国人!")
data = fr_w.read()
print("%s"%data)
'''
我正在写入数据到文件中我正在后面追加文件Hello World!咱们都是中国人!
'''
# 读写 w+
with open("plf.txt","w+",encoding = 'utf-8') as fw_r:
fw_r.write("Hello World!")
fw_r.write("咱们都是中国人!")
data = fw_r.read()
print("%s"%data)
'''
Hello World!咱们都是中国人!
'''
# 读写 a+
with open("plf.txt","a+",encoding = 'utf-8') as fa_rw:
fa_rw.write(" 正在追加数据")
fa_rw.seek(0,0) # 设置光标回到文件头
data = fa_rw.read()
print("%s"%data)
'''
Hello World!咱们都是中国人! 正在追加数据
'''
'''
总结:
常用的模式有(r,w,a,rt,wt,at,rb,wb,ab),通常不推荐可读可写的模式,存在IO问题。
t模式,代表文本模式
b模式,代表将文本内容转化为二进制,使用该模式时,不要增加编码
'''
总结:
模式 | 可做操作 | 若文件不存在 | 是否覆盖 |
---|---|---|---|
r | 只能读 | 报错 | - |
r+ | 可读可写 | 报错 | 是 |
w | 只能写 | 创建 | 是,清空再写 |
w+ | 可读可写 | 创建 | 是,清空再写 |
a | 只能写(追加) | 创建 | 否,追加写 |
a+ | 可读可写 | 创建 | 否,追加写 |
绝对路径,相对路径
绝对路径:从根目录到某一个文件的路径
相对路径:从当前位置到某一个文件的路径
文件操作的方法
# truncate() 保留从文件头的三个字节(一个中文字符是是三个字节,英文字符为2个字节)
with io.open("plf.txt","w+",encoding="utf-8") as fr_w:
fr_w.write("你快点走开")
fr_w.write("咱们都是中国人!")
fr_w.truncate(3)
data = fr_w.read()
print("%s"%data)
# tell() 返回光标所在的位置(按字节算),除了read()是按字符算,其他文件操作的方法都是按照字节算
with io.open("plf.txt","w+",encoding="utf-8") as fr_w:
fr_w.write("你快点走开")
fr_w.write("咱们都是中国人!")
num = fr_w.tell()
print(num)
# seek 第一个0:光标偏移多个字节 第二个0:有三种模式。0表示光标回到文件头;1表示光标在当前位置进行偏移;2表示光标在文件尾进行漂移
with io.open("plf.txt","w+",encoding="utf-8") as fr_w:
fr_w.write("你快点走开")
fr_w.write("咱们都是中国人!")
fr_w.seek(0,0) #
num = fr_w.tell
print(num)
# read(n) 不传参默认表示一次性把文件中的内容全读出来,n代表字符个数。除此之外,其他但凡涉及文件指针的都是字节个数
with open("plf.txt","r",encoding = 'utf-8') as fr:
data = fr.read()
print("文件内容为:%s"%data)
# readline() 读取一行内容
with open("plf.txt","r",encoding = 'utf-8') as fr:
data = fr.readline()
print("文件内容为:%s"%data)
# readlines() 列表,它会将每一行内容当做一个元素存入列表中 (不推荐,占内存)
with open("plf.txt","r",encoding = 'utf-8') as fr:
for i in fr.readlines():
print("%s"%i)
# 直接使用文件操作符,来遍历文件内容。(推荐使用)
with open("plf.txt","r",encoding = 'utf-8') as fr:
for i in fr:
print("%s"%i)
修改文件的两种方式
-
第一种:从A文件读取完数据之后,然后把数据重新写入A文件中(不推荐使用,可能存在IO问题)
with open('37r.txt','w+') as fr, data = fr.read() # 全部读入内存,如果文件很大,会很卡 data = data.replace('tank', 'tankSB') # 在内存中完成修改 fr.write(data) # 一次性写入原文件 print('done...')
-
第二种:从A文件中读取数据,然后再写入B文件中,最后删除A文件,同时将B文件名改为A文件名
import os with open('37r.txt') as fr,\ open('37r_swap.txt', 'w') as fw: # 循环读取文件内容,逐行修改 for line in fr: line = line.replace('jason', 'jasonSB') # 新文件写入原文件修改后内容 fw.write(line) os.remove('37r.txt') os.rename('37r_swap.txt', '37r.txt') print('done...')