读文件:r 模式
实例演示1:
f1 = open(file=‘D:\Python3.5-learn\模块2\character3_文件操作\staff_table.txt‘,mode=‘r‘,encoding=‘utf-8‘) # 以 r 的 模式,打开指定路径的文件 ,按照utf-8 的方式去读取
data = f.read() # 读取文件,表示读取所有内容
f.close() # 关闭文件
实例演示2:
f2 = open(file=‘D:\Python3.5-learn\模块2\character3_文件操作\staff_table.txt‘,mode=‘rb‘,encoding=‘utf-8‘) # 以 rb 二进制 的 模式,打开指定路径的文件 ,按照utf-8 的方式去读取
data = f.read() # 读取文件,表示读取所有内容
f2.close() # 关闭文件
示例2和示例1的区别在哪?
答:在于示例2打开文件时并未指定encoding,这是为何?是因为直接以rb模式打开了文件 ,rb是指二进制模式,数据读到内存里直接是bytes格式,如果想内容,还需要手动decode,因此在文件打开阶段,不需要指定编码
循环遍历文件:
f = open(file=‘D:\Python3.5-learn\模块2\character3_文件操作\staff_table.txt‘,mode=‘r‘,encoding=‘utf-8‘) #
for line in f:
print(line)
f.close()
写文件:w 模式
实例演示1:
f1 = open(file=‘D:\Python3.5-learn\模块2\character3_文件操作\staff_table.txt‘,mode=‘w‘,encoding=‘utf-8‘) # 以 w 的 模式,打开指定路径的文件 ,按照utf-8 的方式去写
data = f.write(“.....”) # 写入指定的文件
f.close() # 关闭文件
实例演示2:
f2 = open(file=‘D:\Python3.5-learn\模块2\character3_文件操作\staff_table.txt‘,mode=‘rb‘,encoding=‘utf-8‘) # 以 wb 二进制 的 模式,打开指定路径的文件 ,按照utf-8 的方式去读取
data = f.write(“.....”) # 写入指定的文件
f2.close() # 关闭文件
提示:文件以w 或者 wb 的方式去操作的时候,会清空原有的文件,
wb,写入时需要直接传入以某种编码的0100101,即:字节类型
w 和 encoding,写入时需要传入unicode字符串,内部会根据encoding制定的编码将unicode字符串转换为该编码的 010101010
追加文件:a模式
f1 = open(file=‘D:\Python3.5-learn\模块2\character3_文件操作\staff_table.txt‘,mode=‘a‘,encoding=‘utf-8‘) # 以 w 的 模式,打开指定路径的文件 ,按照utf-8 的方式去写
data = f.write(“\n11,Kevin Chen,22,13151054603,Sales,2013-04-01”) # 写入指定的文件
f1.close() # 关闭文件
文件操作时,以 “a”或“ab” 模式打开,则只能追加,即:在原来内容的尾部追加内容
写入到硬盘上时,必须是某种编码的0101010,打开时需要注意:
ab,写入时需要直接传入以某种编码的0100101,即:字节类型
a 和 encoding,写入时需要传入unicode字符串,内部会根据encoding制定的编码将unicode字符串转换为该编码的 010101010
读写模式:r+
f1 = open("beiying2.txt", "r+",encoding="utf-8") # 以读写的方式打开文件
data = f1.read() # 读取文件
print(data)
f1.write("\n first line") # 在文件的末尾追加文件
f1.close() # 关闭文件
写读模式:w+
f1 = open("beiying.txt", "w+", encoding="utf-8")
data = f1.read()
print(data)
f1.write("line 1")
f1.write("\nline 2")
f1.write("\nline 3")
f1.write("\nline 4")
f1.close()
w+会先把文件清空,再写新内容,相比w模式,只是支持了一个读功能,且还只能读已经写入的新内容
文件操作的其他方式:
def flush(self, *args, **kwargs): # real signature unknown
把文件从内存buffer里强制刷新到硬盘
def seek(self, *args, *kwargs): # real signature unknown
把操作文件的光标移到指定位置
注意seek的长度是按字节算的, 字符编码存每个字符所占的字节长度不一样。
如“路飞学城” 用gbk存是2个字节一个字,用utf-8就是3个字节,因此以gbk打开时,seek(4) 就把光标切换到了“飞”和“学”两个字中间。
但如果是utf8,seek(4)会导致,拿到了飞这个字的一部分字节,打印的话会报错,因为处理剩下的文本时发现用utf8处理不了了,因为编码对不上了。少了一个字节
def tell(self, *args, **kwargs): # real signature unknown
返回当前文件操作光标位置
def truncate(self, *args, *kwargs): # real signature unknown
按指定长度截断文件
指定长度的话,就从文件开头开始截断指定长度,不指定长度的话,就从当前位置到文件尾部的内容全去掉。
原文:http://blog.51cto.com/sdsca/2108322