Python - 文件读写
Posted Sch01aR#
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python - 文件读写相关的知识,希望对你有一定的参考价值。
-
读写模式:
r:只读模式(如果没指定模式,默认为只读模式)
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" f = open(file=\'file_test\', mode=\'r\') # 文件句柄 fr = f.read() print(fr) f.close() # 关闭文件
运行结果
如果对同一个文件句柄连续进行 read() 操作的话,只有第一个 read() 操作有内容,其余的都是空白的
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" f = open(file=\'file_test\', mode=\'r\') # 文件句柄 fr = f.read() fr1 = f.read() fr2 = f.read() print(fr) print("---------") print(fr1) print("+++++++++") print("---------") print(fr2) print("+++++++++") f.close() # 关闭文件
运行结果
因为 read() 操作是连续的
readline() 进行一行一行地读取
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" f = open(file=\'file_test\', mode=\'r\') # 文件句柄 print(f.readline()) print(f.readline()) print(f.readline()) print(f.readline()) print(f.readline()) f.close() # 关闭文件
运行结果
因为每一行末尾都有一个换行符 \\n,打印的时候 \\n 也打印了,所以空了一行
readlines() 以行为单位读取文件内容
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" f = open(file=\'file_test\', mode=\'r\') # 文件句柄 fr = f.readlines() print(fr) f.close() # 关闭文件
运行结果
结果是列表,每行字符串为该列表的元素,每行末尾有个换行符 \\n
打印每行的内容
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" f = open(file=\'file_test\', mode=\'r\') # 文件句柄 for line in f.readlines(): print(line.strip()) # strip() 去掉换行符 f.close() # 关闭文件
运行结果
readlines() 遇到大文件时比较占内存,因为 readlines() 直接将整个文件读入内存,推荐用下面的方法
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" f = open(file=\'file_test\', mode=\'r\') # 文件句柄 for line in f: print(line.strip()) # strip() 去掉换行符 f.close() # 关闭文件
这个方法是一行一行地读
readable() 判断文件是否可读
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" f = open(file=\'file_test\', mode=\'r\') # 文件句柄 fr = f.readable() print(fr) f.close() # 关闭文件
运行结果
w:只写模式,文件不存在则创建,文件存在则覆盖原文件
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" f = open(file=\'file_w\', mode=\'w\') f.write(\'悯农\\n\') f.write(\'李绅\\n\') f.write(\'春种一粒粟,秋收万颗子。\\n\') f.write(\'四海无闲田,农夫犹饿死。\') f.close()
运行,创建了一个文件“file_w”(本地没有该文件)
如果文件存在的话
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" f = open(file=\'file_w\', mode=\'w\') f.write(\'test\') f.close()
运行结果
之前的内容被新的内容覆盖了
还有一个 writelines() 方法,可以写入一个序列
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" f = open(file=\'file_w\', mode=\'w\') f.writelines(["春种一粒粟,", "秋收万颗子。\\n"]) f.writelines(("四海无闲田,", "农夫犹饿死。\\n")) f.writelines({"锄禾日当午,", "汗滴禾下土。\\n"}) f.writelines("谁知盘中餐,粒粒皆辛苦。") f.close()
运行结果
用逗号隔开的各个元素进行拼接
用 writeable() 判断文件是否可写
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" f = open(file=\'file_w\', mode=\'w\') print(f.writable()) f.close()
运行结果
a:追加模式,只能写不能读,不会创建新文件,不会覆盖原文件,在原文件后追加内容
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" f = open(file="file_w", mode=\'a\') f.write(\'\\nThis is a test\') f.close()
运行结果
追加模式写的方法和只读模式用的方法一样,只不过追加模式是在原文件末尾添加内容
rb:只读二进制模式
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" f = open(file=\'file_test\', mode=\'rb\') fr = f.read() print(fr) f.close()
运行结果
wb:只写二进制模式
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" f = open(file=\'file_w\', mode=\'wb\') f.write(\'春种一粒粟,秋收万颗子。\\n\'.encode()) f.write(b\'This is a test\') f.close()
运行结果
rb、wb、ab 都可以用来读写图片文件、音频文件等
ab:追加二进制模式
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" f = open(file="file_w", mode=\'ab\') f.write(\'\\nThis is from append1\\n\'.encode()) f.write(b\'This is from append2\') f.close()
运行结果
r+:读写模式,既可读,也可以写(读模式支持写)
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" f = open(file=\'file_test\', mode=\'r+\') fr = f.read() print(fr) f.write(\'From Writing\') fr1 = f.read() print(fr1) f.close()
运行结果
写入的内容
后来写进去的那句话并没有被读出来
w+:写读模式,既可写,也可以读(写模式支持读)
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" f = open(file=\'file_w\', mode=\'w+\') print(f.read()) f.write(\'四海无闲田,\') f.write(\'农夫犹饿死。\') print(f.read()) f.close()
运行结果
读出的内容是空的
写入的内容
原来的内容被覆盖了
a+:可读追加模式
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" f = open(file="file_w", mode=\'a+\') print(f.read()) f.write(\'\\nThis is from append1\\n\') f.write(\'This is from append2\') print(f.read()) f.close()
运行结果
写入的内容
-
其他操作:
判断文件是否已经关闭
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" f = open(file=\'file_test\', mode=\'r\') print(f.closed) # 判断文件是否已经关闭 f.close() print(f.closed)
运行结果
查看文件名
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" f = open(file=\'file_test\', mode=\'r\') print(f.name) # 查看文件名 f.close()
运行结果
查看光标的位置
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" f = open(file=\'file_test\', mode=\'r\') print(f.readline()) print(f.tell()) # 查看光标所在位置 f.close()
运行结果
光标所在位置为字符数,包括空格,包括换行符等符号,换行符占两个字符
移动光标所在的位置
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" f = open(file=\'file_test\', mode=\'r\') print(f.readline()) print(f.readline()) print(f.tell()) # 查看光标所在位置 f.seek(17) # 把光标设置在 17 的位置 print(f.tell()) # 查看光标所在位置 print(f.readline()) f.close()
运行结果
最后一个 print(f.readline()) 打印的是光标新位置所在行之后的内容,也就是 web
判断光标的位置是否可移动
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" f = open(file=\'file_test\', mode=\'r\') print(f.readline()) print(f.seekable()) # 判断光标的位置是否可移动 f.close()
运行结果
对文件读写的刷新
文件读写有个缓存的机制,读写的时候不会一个字符或者一行地写入文件,而是先保存在缓冲区,待到缓冲区满的时候再统一写入文件
这样有可能会导致发生意外情况时的数据丢失
用 write() 向 file_w 文件中写入内容,查看的时候却没有,这时候需要用到 flush()
直接写入了
对文件进行截断
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" f = open(file=\'file_test\', mode=\'a\') f.truncate(18) # 对文件进行截断前 18 个字符 f.close()
运行结果
截断到第 18 个字符
判断是否为终端设备
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" f = open(file=\'file_test\', mode=\'a\') print(f.isatty()) f.close()
运行结果
查看文件编码
>>> f = open(file="file_test", mode="r") >>> f.encoding # 查看文件编码 \'UTF-8\'
查看文件读写模式
>>> f = open(file="file_test", mode="r") >>> f.mode # 查看文件读写模式 \'r\'
查看文件句柄的编号
>>> f = open(file="file_test", mode="r") >>> f.fileno() # 文件句柄的编号 4
以上是关于Python - 文件读写的主要内容,如果未能解决你的问题,请参考以下文章