python的文件操作
1、Python文件的读和写
使用Python对文件进行读和写是十分简单的。为此,你首先必须使用合适的模式打开文件。这里有一个如何打开文本文件并读取其内容的例子。
open()
接收一个文件名和一个模式作为它的参数,r
表示以只读模式打开文件。想要往文件中写数据的话,则用w
作为参数。
2、获取目录
当前的工作目录有一个叫 py的目录,该目录包含如下内容:
Python内置的 os
模块有很多有用的方法能被用来列出目录内容和过滤结果。为了获取文件系统中特定目录的所有文件和文件夹列表,Python 3.x 中使用 os.scandir()
。 如果你还想获取文件和目录属性(如文件大小和修改日期), os.scandir()
则是首选的方法。
这里 os.scandir()
和with语句一起使用,因为它支持上下文管理协议。使用上下文管理器关闭迭代器并在迭代器耗尽后自动释放获取的资源。
另一个获取目录列表的方法是使用 pathlib
模块:
pathlib.Path()
对象有一个 .iterdir()
的方法用于创建一个迭代器包含该目录下所有文件和目录。由 .iterdir()
生成的每个条目都包含文件或目录的信息,例如其名称和文件属性。pathlib
在Python3.4时被第一次引入,并且是对Python一个很好的加强,它为文件系统提供了面向对象的接口。
3、获取文件属性
Python可以很轻松的获取文件大小和修改时间等文件属性。可以通过使用 os.stat()
, os.scandir()
或 pathlib.Path
来获取。
os.scandir()
和 pathlib.Path()
能直接获取到包含文件属性的目录列表。这可能比使用 os.listdir()
列出文件然后获取每个文件的文件属性信息更加有效。
os.scandir()
返回一个 ScandirIterator
对象。ScandirIterator
对象中的每一项有 .stat()
方法能获取关于它指向文件或目录的信息。.stat()
提供了例如文件大小和最后修改时间的信息。在上面的示例中,代码打印了 st_time
属性,该属性是上次修改文件内容的时间。
4、创建目录
你编写的程序迟早需要创建目录以便在其中存储数据。 os
和 pathlib
包含了创建目录的函数。我们将会考虑如下方法:
创建单个目录
如果该目录已经存在,os.mkdir()
将抛出 FileExistsError
异常。或者,你也可以使用 pathlib
来创建目录:
当发生错误时捕获错误并让你的用户知道可以这样:
创建多个目录
os.makedirs()
和 os.mkdir()
类似。两者之间的区别在于,os.makedirs()
不仅可以创建单独的目录,还可以递归的创建目录树。换句话说,它可以创建任何必要的中间文件夹,来确保存在完整的路径。
os.makedirs()
和在bash中运行 mkdir -p
类似。例如,要创建一组目录像 2018/10/05,你可以像下面那样操作:
另一个方式创建多个目录是使用 pathlib.Path
的 .mkdir()
:
通过给 Path.mkdir()
传递 parents=True
关键字参数使它创建目录和使其路径有效的所有父级目录。
在默认情况下,os.makedirs()
和 pathlib.Path.mkdir()
会在目标目录存在的时候抛出 OSError
。通过每次调用函数时传递 exist_ok=True
作为关键字参数则可以覆盖此行为(从Python3.2开始)
5、遍历目录和处理文件
Python函数 os.walk()
来实现这一功能。os.walk()
用于通过从上到下或从下到上遍历树来生成目录树中的文件名,os.walk()
默认是从上到下遍历目录:
os.walk()
在每个循环中返回三个值:
- 当前文件夹的名称
- 当前文件夹中子文件夹的列表
- 当前文件夹中文件的列表
要以自下而上的方式遍历目录树,则将 topdown=False
关键字参数传递给 os.walk()
:
6、创建临时文件和目录
Python提供了 tempfile
模块来便捷的创建临时文件和目录。
tempfile
可以在你程序运行时打开并存储临时的数据在文件或目录中。 tempfile
会在你程序停止运行后删除这些临时文件。
第一步是从 tempfile
模块导入 TemporaryFile
。 接下来,使用 TemporaryFile()
方法并传入一个你想打开这个文件的模式来创建一个类似于对象的文件。这将创建并打开一个可用作临时存储区域的文件。
在上面的示例中,模式为 w + t
,这使得 tempfile
在写入模式下创建临时文本文件。 没有必要为临时文件提供文件名,因为在脚本运行完毕后它将被销毁。
写入文件后,您可以从中读取并在完成处理后将其关闭。 一旦文件关闭后,将从文件系统中删除。
tempfile
也可用于创建临时目录。 使用 tempfile.TemporaryDirectory()
来做到这一点:
调用 tempfile.TemporaryDirectory()
会在文件系统中创建一个临时目录,并返回一个表示该目录的对象。 在上面的示例中,使用上下文管理器创建目录,目录的名称存储在 tmpdir
变量中。 第三行打印出临时目录的名称,os.path.exists(tmpdir)
来确认目录是否实际在文件系统中创建。
在上下文管理器退出上下文后,临时目录将被删除,并且对 os.path.exists(tmpdir)
的调用将返回False,这意味着该目录已成功删除。
7、删除文件和目录
要删除单个文件,请使用 pathlib.Path.unlink()
,os.remove()
或 os.unlink()
。
os.remove()
和 os.unlink()
在语义上是相同的。 要使用 os.remove()
删除文件,请执行以下操作:
使用 os.unlink()
删除文件与使用 os.remove()
的方式类似:
在文件上调用 .unlink()
或 .remove()
会从文件系统中删除该文件。 如果传递给它们的路径指向目录而不是文件,这两个函数将抛出 OSError
。 为避免这种情况,可以检查你要删除的内容是否是文件,并在确认是文件时执行删除操作,或者可以使用异常处理来处理 OSError
:
使用 pathlib.Path.unlink()
删除文件:
标准库提供了一下函数来删除目录:
要删除单个目录或文件夹可以使用 os.rmdir()
或 pathlib.Path.rmdir()
。这两个函数只在你删除空目录的时候有效。如果目录不为空,则会抛出 OSError
:
使用 pathlib
来删除目录:
要删除非空目录和完整的目录树,Python提供了 shutil.rmtree()
:
以上使用了
8、复制、移动和重命名文件和目录
shutil
提供了一些复制文件的函数。 最常用的函数是 shutil.copy()
和 shutil.copy2()
。 使用shutil.copy()
将文件从一个位置复制到另一个位置。
复制时保留所有文件元数据,请使用 shutil.copy2()
:
shutil.copy()
只复制单个文件,但 shutil.copytree()
将复制整个目录及其中包含的所有内容。 shutil.copytree(src,dest)
接收两个参数:源目录和将文件和文件夹复制到的目标目录。
文件或目录移动到其他位置,请使用 shutil.move(src,dst)
src
是要移动的文件或目录,dst
是目标:
重命名文件和目录的 os.rename(src,dst)
:
另一种重命名的方法是使用 pathlib
模块中的 rename()
:
要使用 pathlib
重命名文件,首先要创建一个 pathlib.Path()
对象,该对象包含要替换的文件的路径。 下一步是在路径对象上调用 rename()
并传入你要重命名的文件或目录的新名称。