Python教程 - 文件读写
本篇将介绍“文件读写”的内置函数 open,通过 Python 的 open 函数,就能针对电脑中的文件,进行新增、打开、编辑等操作。
使用 open()
Python 内置的 open()使用的语法如下所示,文件表示文件的路径和文件名,模式则代表打开文件后,能对这个文件编辑的权限模式,默认为 r。
f = open('文件', 模式)
open()还有几个可以不填写的参数,不填写则会使用默认值:
参数 | 说明 |
---|---|
newline | 换行模式,默认 None (使用通用换行符号,等同 ''),可以是''、'\n'、'\r' 或 '\r\n'。 |
encoding | 解码或编码文件名,默认 None。 |
errors | 处理解码或编码时的错误,默认 None。 |
buffering | 内存缓冲区大小,默认-1。 |
closefd | 判断文件名或文件描述,默认 True。 |
opener | 文件描述,默认 None。 |
文件路径
文件的路径使用“相对路径”,相对于“执行这个 Python 程序的位置”,例如 Python 的程序位于 file 文件夹下,要访问 file/demo 文件夹内的 test.txt 文件时,路径就是"demo/test.txt"。
f = open('demo/test.txt','r')
a = f.read()
print(a)
f.close()
访问模式
使用 open()打开文件时,可指定打开后文件的访问模式,默认是文本模式打开,后方如果有“+”号,表示在功能上不仅可以读取,也可以写入:
模式 | 说明 |
---|---|
r、rt | 读取文件 (默认值,文件必须存在)。 |
w、wt | 写入文件 (如果文件不存在,就创建新文件,如果文件存在,则清空内容并将其覆写)。 |
x、xt | 创建新的文件 (只针对不存在的文件,如果文件已经存在,则操作失败)。 |
a、at | 从文件的最末端添加内容 (如果文件不存在,就创建新文件)。 |
r+、rt+ | 读取并更新文件 (更新方式从文件起始处写入内容)。 |
w+、wt+ | 写入并读取文件(会清空并覆盖内容)。 |
a+、at+ | 从文件的最末端添加内容并读取文件。 |
如果后方加上 b,则会以二进制模式打开:
模式 | 说明 |
---|---|
rb | 以二进制模式读取文件。 |
wb | 以二进制模式写入文件。 |
xb | 以二进制模式创建一个新的文件。 |
ab | 以二进制模式从文件的最末端添加内容。 |
rb+ | 以二进制模式读取并更新文件。 |
wb+ | 以二进制模式写入并读取文件。 |
ab+ | 以二进制模式从文件的最末端添加内容并读取文件。 |
举例来说,如果打开文件时模式设置为 w,就无法使用读取的方法读取文件内容。
f = open('demo/test.txt','w') # 使用 w 模式
a = f.read() # 发生错误 not readable
print(a)
如果打开文件时设置 r+,则可以读取内容也可以从开头的地方加入内容(使用 r 或 r+时,文件必须存在,否则会发生错误)。
f = open('demo/test.txt','r+')
a = f.read()
f.write('hello')
print(a)
f.close()
操作方法
打开文件后,可以通过下列常用的方法操作文件:
方法 | 说明 |
---|---|
read(size) | 读取文件内容,默认不设置 size,不设置 size 会读取整个文件,如果设置 size 则会读取指定的字节数量。 |
readline(size) | 读取文件的第一行内容,默认不设置 size,没有设置 size 就会读取一整行,如果设置 size 则会读取指定的字节数量。 |
readlines(size) | 读取文件内容并以列表方式返回,默认不设置 size,如果没有设置 size 会读取全部内容,如果设置 size 则会返回包含 size 大小的那几行。 |
readable() | 文件是否可读取,返回 True 或 False。 |
write(文字内容) | 写入内容。 |
writelines(文字内容列表) | 以列表方式写入内容,如果需要换行必须自行加入换行符号\n。 |
writable() | 文件是否可写入,返回 True 或 False。 |
tell() | 返回目前读取文件指针的位置 (文件从头算起的字节数)。 |
seek(偏移量, 起始位置) | 移动文件指针 (起始位置默认 0 表示文件开头,1 为当前位置,2 为文件结尾)。 |
close() | 关闭文件,并释放内存。 |
-
read(size)
示例的代码使用两种方式读取内容为 hello world 的 txt 文件(如果只设置一个 f1,使用 read()之后就会自动读取整份文件,read(2)就会失效,所以使用 f1 和 f2),如果没有设置 size,则完整读取整份文件,如果有设置 size,则读取到 size 的字节数,读取的文件如果超过电脑的内存大小,则会发生问题(读取 1GB 的文件就会消耗 1GB 的内存)。
f1 = open('demo/test.txt','r') f2 = open('demo/test.txt','r') a = f1.read() b = f2.read(2) print(a) # hello world print(b) # he ( 只读取前两个字节 ) f1.close() f2.close()
-
readline(size)
示例的代码使用两种方式读取内容为第一行 hello world 的 txt 文件,如果没有设置 size,则完整读取第一行,如果有设置 size 则读取第一行的 size 字节数,若 size 超过第一行的数量,就会完整读取第一行(就算文件有很多行,还是只会读取第一行)。
f1 = open('demo/test.txt','r') f2 = open('demo/test.txt','r') a = f1.readline() b = f2.readline(2) print(a) # hello world print(b) # he ( 只读取单一行的前两个字节 ) f1.close() f2.close()
-
readlines(size)
示例的代码使用两种方式读取内容为三行 hello world、good morning 和 12345 的 txt 文件,如果没有设置 size 则读取全部的文件内容,以行为单位返回为列表,如果有设置 size,则会以 size 抵达的字节位置行数为最大行数,返回为列表。
f1 = open('demo/test.txt','r') f2 = open('demo/test.txt','r') a = f1.readlines() # 读取全部的行,变成列表形式 b = f2.readlines(20) # 读取包含 20 个字节的行,变成列表形式 print(a) # ['hello world\n', 'good morning\n', '12345'] print(b) # ['hello world\n', 'good morning\n'] f1.close() f2.close()
-
readable()
示例的代码执行后,会显示这个文件是否能读取,或是否能写入,返回 True 或 False。
f1 = open('demo/test.txt','w') f2 = open('demo/test.txt','r') print(f1.readable()) # Fasle 因为设置 w print(f2.readable()) # True 因为设置 r f1.close() f2.close()
-
f.write(文字内容)
示例的代码执行后,会清空原本 test.txt 的内容,写入新的内容。
f1 = open('demo/test.txt','w') f1.write('good morning') # 写入 good morning f1.close()
-
f.writelines(文字内容列表)
示例的代码执行后,会清空原本 test.txt 的内容,并以列表方式写入内容,如果需要换行必须自行加入换行符号\n。
f1 = open('demo/test.txt','w') f1.writelines(['123\n','456\n','789\n']) # 写入三行内容 f1.close()
-
writeable()
示例的代码执行后,会显示这个文件是否能读取,或是否能写入,返回 True 或 False。
f1 = open('demo/test.txt','w') f2 = open('demo/test.txt','r') print(f1.writeable()) # True 因为设置 w print(f2.writeable()) # False 因为设置 r f1.close() f2.close()
-
tell()
示例的代码执行后,会返回目前读取文件指针的位置 (文件从头算起的字节数)。
f1 = open('demo/test.txt','r') a = f1.read(5) # 读取前五个字节,读取完毕后指针位在 5 t = f1.tell() # 读取指针位置 print(a) # hello print(t) # 5 f1.close()
-
seek(偏移量, 起始位置)
示例的代码执行后,会将指针从开头位置移动 5 个字节,然后再读取 5 个字节 (起始位置默认 0 表示文件开头,1 为当前位置,2 为文件结尾)。
f1 = open('demo/test.txt','r') # 内容为 123456789 f1.seek(2,0) # 将指针移动到 2 和 3 中间 a = f1.read(5) # 读取后方五个字节 print(a) # 34567 f1.close()
-
close()
关闭文件,并释放内存。
使用 with
使用 with 可以打开文件,执行相关操作后自动关闭文件并释放内存,使用的语法如下:
with open('demo/test.txt','w') as f1:
f1.write('good morning') # 写入 good morning
# 完成后如果没有后续动作,就会自动关闭文件
转载自:https://juejin.cn/post/7376563996424175650