Python如何处理文件?了解如何使用 os 和 shutil 模块在 Python 中处理文件,包括创建、重命名、移动、删除文件和目录,列出所有当前文件和目录等,包括一些Python处理文件代码示例。
在软件行业中,大多数程序以一种或另一种方式处理文件,例如创建文件、重命名文件、移动文件、列出文件等。作为程序员,你绝对应该具备这种基本技能。因此,在本教程中,我们将使用Python 中的os模块对文件和目录进行多项操作,而不管我们使用的是哪种操作系统。
如何在Python中处理文件?现在,你需要知道os模块不仅用于处理文件和目录,它还有大量用于其他操作的方法和工具,例如处理环境变量、命令行参数、系统进程管理,甚至 Linux 扩展特定于Linux 操作系统的属性。
好的,让我们开始吧,因为os模块是一个内置模块,所以我们不需要安装任何东西。
你可能也会对此感兴趣:如何在 Python 中获取目录的大小。
在本教程中,你将学习:
- 打印当前工作目录
- 创建目录
- 更改目录
- 创建嵌套目录
- 创建文件
- 重命名文件
- 移动文件
- 列出文件和目录
- 删除文件
- 删除目录
- 检索有关文件的信息
打印当前工作目录
为了获取当前工作目录,你需要使用os.getcwd():
import os
# print the current directory
print("The current directory:", os.getcwd())
os.getcwd()返回一个代表当前工作目录的 Unicode 字符串,这是我的输出:
The current directory: C:\pythoncode-tutorials\python-standard-library
创建目录
Python处理文件代码示例:要在任何操作系统中创建文件夹/目录,你需要做的就是:
# make an empty directory (folder)
os.mkdir("folder")
执行此操作后,它将立即在当前工作目录中生成一个名为“文件夹”的目录。
如果你再次运行它,它会引发一个FileExistsError,那是因为文件夹已经存在,解决这个问题的一个好方法是,只有当文件夹不存在时才运行os.mkdir(),我们可以很容易地做到这一点:
# running mkdir again with the same name raises FileExistsError, run this instead:
if not os.path.isdir("folder"):
os.mkdir("folder")
如果我们传递的路径名是指现有目录,则os.path.isdir()函数返回True。
更改目录
Python如何处理文件?更改目录相当容易,让我们切换到我们刚刚创建的文件夹:
# changing the current directory to 'folder'
os.chdir("folder")
现在让我们再次打印工作目录:
# printing the current directory now
print("The current directory changing the directory to folder:", os.getcwd())
输出:
The current directory changing the directory to folder: C:\pythoncode-tutorials\python-standard-library\folder
创建嵌套目录
假设你不仅要创建一个文件夹,而且要创建多个嵌套文件夹:
# go back a directory
os.chdir("..")
# make several nested directories
os.makedirs("nested1/nested2/nested3")
这将递归创建3 个文件夹,如下图所示:
创建文件
如何在Python中处理文件?为了在 Python 中创建文件,你不需要任何模块,你可以使用内置函数open(),它将你要创建的文件名作为第一个参数以及你要打开文件的模式作为第二个参数:
# create a new text file
text_file = open("text.txt", "w")
# write to this file some text
text_file.write("This is a text file")
我使用“w”作为代表write 的文件打开模式,你也可以使用“a”附加到现有文件或“r”读取现有文件。有关文件打开模式的更多信息,请查看此页面。
重命名文件
使用os模块重命名文件非常容易,让我们重命名刚刚创建的文件:
# rename text.txt to renamed-text.txt
os.rename("text.txt", "renamed-text.txt")
os.rename()函数接受2 个参数,要重命名的文件或目录的名称,以及要重命名的目标名称。
Python处理文件代码示例:移动文件
我们可以使用os.replace()函数来移动文件或目录:
# replace (move) this file to another directory
os.replace("renamed-text.txt", "folder/renamed-text.txt")
请注意,这将覆盖目标,因此如果“文件夹”中存在另一个具有相同名称“renamed-text.txt”但内容不同的预先存在的文件,它将覆盖它。
相关: 如何在 Python 中加密和解密文件。
Python如何处理文件?列出文件和目录
# print all files and folders in the current directory
print("All folders & files:", os.listdir())
os.listdir()函数返回一个包含目录中文件名称的列表,我们没有传递任何参数作为参数,因此它将返回当前工作目录的文件和目录,这是我的输出:
All folders & files: ['folder', 'handling-files', 'nested1', 'text.txt']
好的,但是如果我们也想知道这些文件夹的内容怎么办?我们需要改用os.walk()函数:
# print all files & folders recursively
for dirpath, dirnames, filenames in os.walk("."):
# iterate over directories
for dirname in dirnames:
print("Directory:", os.path.join(dirpath, dirname))
# iterate over files
for filename in filenames:
print("File:", os.path.join(dirpath, filename))
复制os.walk()是一个目录树生成器,它将遍历所有目录树,我已经通过了“.” 作为这棵树的顶部,它指的是当前工作目录,这里是输出:
Directory: .\folder
Directory: .\handling-files
Directory: .\nested1
File: .\text.txt
File: .\handling-files\listing_files.py
File: .\handling-files\README.md
Directory: .\nested1\nested2
Directory: .\nested1\nested2\nested3
我还使用os.path.join()方法将我们所在的当前路径与文件/目录名称连接起来。
删除文件
如何在Python中处理文件?让我们删除我们创建的文件:
# delete that file
os.remove("folder/renamed-text.txt")
os.remove()顾名思义,它删除给定路径名的文件(不是目录)。或者,你可以使用os.unlink()
它来做完全相同的事情。
Python处理文件代码示例:删除目录
使用os.rmdir()函数将删除给定的文件夹:
# remove the folder
os.rmdir("folder")
要递归删除目录,我们需要使用os.removedirs()函数:
# remove nested folders
os.removedirs("nested1/nested2/nested3")
当然,这只会在它们为空时删除所有这些目录。
为了删除非空目录(包含文件的目录和子目录),我们需要使用shutil中的rmtree()
方法:
# remote non-empty folders
shutil.rmtree("nested1")
此方法将递归删除整个nested1
目录树,当然,你需要具备必要的权限才能这样做,因为如果你对正在执行的操作无意识,那将非常危险。
检索有关文件的信息
Python如何处理文件?为了获取有关操作系统中给定文件的一些信息,有一个很酷的函数os.stat()可以在给定路径上执行stat 系统调用:
open("text.txt", "w").write("This is a text file")
# print some stats about the file
print(os.stat("text.txt"))
这是输出:
os.stat_result(st_mode=33206, st_ino=14355223812608232, st_dev=1558443184, st_nlink=1, st_uid=0, st_gid=0, st_size=19, st_atime=1575967618, st_mtime=1575967618, st_ctime=1575966941)
这返回了一个命名元组,其中包含一些指标,我们不会涵盖所有这些属性,但有些很有趣:
st_size:文件的大小(以字节为单位)。
st_atime:最近访问的时间,以秒(时间戳)表示。
st_mtime:最近修改的时间。
st_ctime:在 Windows 中,这是创建文件的时间,在 Unix 中,这是最近一次元数据更改的时间。
Python处理文件代码示例 - 要获取特定属性,你可以执行以下操作:
# get the file size for example
print("File size:", os.stat("text.txt").st_size)
输出:
File size: 19
查看此页面以获取有关这些属性的更多信息。
结论
如何在Python中处理文件?可以看到,使用这个平台无关的模块在Python中处理文件和目录是非常容易的,在这个模块中你不需要担心任何平台特定的处理等。你也可以使用一些平台特定的函数,例如用于 Linux 的os.chown()或os.chmod()。
当然,我们并没有涵盖所有内容,请阅读Python 的官方文档以获取更多详细信息。