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 - 文件读写的主要内容,如果未能解决你的问题,请参考以下文章

python读写文件

Python代码中打开txt文件(非读写)

python常用代码片段总结

我在哪里更改此 Python 代码片段以将临时文件保存在 tmp 文件夹中?

常用python日期日志获取内容循环的代码片段

Python文件读写