山地人

Python 文件读写

山地人
山地人
2021-07-02

这篇教程,会教会你如何正确使用Python对文件进行读写操作。包括:

  • 如何打开文件?
  • 如何读文件内容?
  • 如何写入内容到文件?
  • 如何正确关闭文件?

Python中读写文件流程

在Python中,不管是读取文件还是写入文件,都有一个正确的操作流程:

  1. 用正确的模式打开文件。
  2. 对文件进行读写操作。
  3. 操作结束后关闭文件。

下面就按照这个步骤,分步进行讲解。

在Python中打开文件

Python提供了一个打开文件的函数open(file),使用这个函数传入路径就可以打开对应路径的文件。如果打开操作执行成功,这个函数会返回一个文件句柄文件句柄就好比是一张此文件的通行证,拿着这个文件句柄,后面要读写文件的事才可以进行。

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

参数说明:

  • file 必传参数,指定文件的路径(可以采用绝对路径和相对路径的写法)
  • mode 指定打开文件的模式
  • buffering 设置缓冲大小,0为关闭缓冲
  • encoding 设置编码格式
  • errors 设置报错等级
  • newline 设置换行符
  • closefd 设置文件关闭时是否关闭文件描述符。(对于给定文件名是,此参数必须为True否则无效)
  • opener 自定义开启器。

上面是open的完整形式,在实际使用时,最常用的是filemodeencoding三个参数。其他参数一般使用默认值就可以了。

说了这么多,我们先来打开一个文件试试:

# 使用当前路径:打开当前目录下的hello.txt
f = open("./hello.txt")
# 使用绝对路径:打开根目录下的home目录下的hello.txt
f = open("/home/hello.txt")

上面的演示代码,分别采用相对路径绝对路径的方式打开了同一个文件。

点击运行,看看打开文件后得到的文件句柄长啥样。

  • 试试将路径改为一个不存在的文件路径,看看运行会有什么结果。

仔细观察上面的实验,你会看到文件句柄里有一些信息。

<_io.TextIOWrapper name='./hello.txt' mode='r' encoding='UTF-8'>

name是你打开的文件的路径,mode是文件的打开模式,一会我们细说。encoding是使用的编码格式UTF-8

下面重点说说文件模式mode,我们在打开一个文件时时需要一个文件模式的,使用不同的mode打开文件会获得不同的文件权限。

模式描述
r以只读的方式打开文件。(默认设置)
w以写模式打开文件,如果这个路径对应的文件不存在会被自动创建,以这个模式写文件时原来文件中的内容会先被清除掉。
x以独占方式打开文件,如果文件已经存在打开会失败,不存在会自动创建一个文件
a以追加写入的方式打开文件,新写入的内容会添加到原内容的后面。如果文件不存在会自动创建一个新文件。
t以文本模式打开文件。(默认设置)
b以二进制模式打开文件。
+以更新的方式打开文件(读写模式),必须要和w,r,a搭配使用。

在打开文件时,可以通过mode关键字参数方式来指定文件打开模式。

f = open(file, mode='w')

在Python中关闭文件

当文件使用完毕后,要养成好的习惯立即将不需要访问的文件关闭掉。

手动关闭文件

f.close()

发生异常也能关闭文件

有时候,从openclose文件之间会有多行代码运行,不能保证之间的运行不发生错误,如果之间发生了错误,那后续的文件关闭动作就没有机会执行到了。为此,我们可以使用一种安全的写法,来保证即使发生异常,close代码也能被执行到。

try:
f = open("hello.txt")
raise("Has Error")
finally:
f.close()

这里我们强制在try代码块中放了一行引发异常的代码raise(...),在下面的演示实验中为了检查f.close()是否确实被关闭,我在f.close后加了一行打印,来表明这里的代码确实被执行到了。

点击运行,看看屏幕上是否有f.close()已运行的字样。

在Python中读文件

打开文件后,通过返回的文件对象f调用read函数来读取文件内容。

需要注意,如果要读取文件内容,open时要指定mode='r'

f.read([size])

可以通过size参数来指定读取文件中指定大小的内容。如果不指定size则一直读到文件结尾。

在Python中写文件

对于使用mode="w"的文件,可以使用f.write往文件中写入内容。

f = open("newfile.txt","w")
f.write("Hello ABC!")
  • 运行此程序
  • 在右侧控制台使用ls命令查看当前路径下是否有newfile.txt文件。
  • cat newfile.txt查看此文件的内容。

Python中文件相关的方法

上面的教程中已经使用了一些文件对象的成员方法,下面的表格列举了完整的文件成员方法。

方法描述
close()关闭文件,如果文件已关闭这个方法也不会有任何副作用。
detach()将底层原始流与缓冲区分离,原始流被分离后,缓冲区处于不可用状态。
fileno()返回文件的编号(文件描述符)。
flush()刷新文件内部缓冲,将缓冲区数据立即写入文件中。
isatty()检测文件是否是一个终端设备,如果是则为True,否则为False。
read([size])读取指定size长度的内容,如果未设置或设置为负数则一直读取到文件末尾。
readable()检测文件是否可读。
readline(size=-1)size不设置或为负值时读取一整行内容,如果设置size则读取最大size大小的数据(碰到换行符则停止)。
readlines([size])将读取的每一行放入列表中,size指定最大可读取的字符数。
seek(offset,from=SEEK_SET)改变当前流的位置,offset是一个相对偏移值
seekable()返回当前对象是否支持随机读写。
tell()返回当前流的位置
truncate(size=None)调整文件流的大小到size,如未给定则调整文件流大小到当前位置。
writable()返回当前文件流是否可写入
write(s)写入数据s到文件中
writelines(lines)写入lines列表中的数据到文件中

至此,本篇教程也到了该和你说再见的时候了,我们下期再见。

学完本篇互动教程,如果你觉得体验不错,可以把网页链接发送给你的小伙伴,让他/她也来感受一下。当然,你也可以继续看看网站上其他的的互动教程,希望`idev365`能够给你带来收获。

学习教程的过程中碰到了问题,或者对idev365有什么改进意见和想法,欢迎加入idev365微信内测群,和山地人交流你的想法。