使用os和shutil操作文件和文件夹
你可以编写Python程序来与文件系统进行交互来做很酷的事情。怎么做并不总是非常清楚。本文是当前和有抱负的开发人员和数据科学家的指南。我们将重点介绍10个基本的os和shutil命令,以便您可以编写脚本来自动化与文件系统的交互。
文件系统有点像房子。假设您正在进行春季清洁,您需要将笔记本盒从一个房间移动到另一个房间。
这些盒子就像目录一样。他们持有东西。在这种情况下,笔记本。
笔记本就像文件一样。您可以读取和写入它们。您可以将它们放在目录框中。Capiche?
在本指南中,我们将介绍os和shutil模块中的方法。所述OS模块是用于与操作系统进行交互的主要Python模块。该shutil模块还包含了高层次的文件操作。出于某种原因,您使用操作系统创建目录,但移动并使用shutil复制它们。去搞清楚。 。
更新:于2019年2月16日增加的pathlib
在Python 3.4中,pathlib模块被添加到标准库中以改进文件路径的使用,从3.6开始,它与标准库的其余部分很好地配合使用。该pathlib方法提供了我们将在下面讨论的方法解析文件路径一些好处-即pathlib将路径作为对象而不是字符串。虽然pathlib很方便,但它没有我们将要探索的所有低级功能。此外,您无疑会在未来几年内在代码中看到os和shutil方法。所以熟悉它们绝对是个好主意。
我打算在以后的文章中讨论pathlib,所以请跟我来确保你不要错过它。要立即了解有关pathlib模块的更多信息,请参阅本文和本文。
在我们挖掘之前要了解的其他一些事情:
- 本指南适用于Python 3.在2020年1月1日之后将不再支持Python 2 。
- 您需要将os和shutil导入到您的文件中才能使用这些命令。
- 我的示例代码可以在GitHub上找到。
- 用下面引号中的参数替换你自己的参数。
现在我们已经完成了背景,让我们开始吧!这是您应该知道的10个命令的列表。
10文件系统方法
下面的列表遵循以下模式:
方法 - 描述 - 等效的macOS Shell命令
获取信息
- os.getcwd() - 将当前工作目录路径作为字符串 - pwd
- os.listdir() - 获取当前工作目录的内容作为字符串列表ls
- os.walk("starting_directory_path")- 返回一个生成器,其中包含当前目录和所有子目录中的目录和文件的名称和路径信息 - 没有确切的短CLI等效,但ls -R提供子目录名称和子目录中文件的名称
改变一切
- os.chdir("/absolute/or/relative/path") - 更改当前工作目录 - cd
- os.path.join()- 创建一个路径供以后使用 - 没有短的CLI等价物
- os.makedirs("dir1/dir2") - 制作目录 - mkdir -ps
- hutil.copy2("source_file_path", "destination_directory_path") - 复制文件或目录 - cp
- shutil.move("source_file_path", "destination_directory_path") - 移动文件或目录 - mv
- os.remove("my_file_path") - 删除文件 - rm
- shutil.rmtree("my_directory_path")- 删除目录及其中的所有文件和目录 - rm -rf
来!我们讨论一下。
获取信息
os.getcwd()
os.getcwd()以字符串形式返回当前工作目录。那一个是直截了当的。
os.listdir()
os.listdir()以字符串列表的形式返回当前工作目录的内容。那一个也很简单。
os.walk("my_start_directory")
os.walk()
创建一个生成器,可以返回有关当前目录和子目录的信息。它通过指定的起始目录中的目录工作。
os.walk()
为它遍历的每个目录返回以下项:
1.当前目录路径作为字符串当。
2.当前目录中的子目录名称作为字符串列表。
3.当前目录中的文件名作为字符串列表。
它为每个目录执行此操作!
它的使用常常是有用的
os.walk()
一个用于循环遍历目录及其子目录的内容。例如,以下代码将打印当前工作目录的目录和子目录中的所有文件。
import os
cwd = os.getcwd()
for dir_path, dir_names, file_names in os.walk(cwd):
for f in file_names:
print(f)
这就是我们获取信息的方式,现在让我们看看更改工作目录或移动,复制或删除文件系统部分的命令。
改变一切
os.chdir("/absolute/or/relative/path")
此方法将当前工作目录更改为提供的绝对路径或相对路径。
如果您的代码随后对文件系统进行了其他更改,那么在使用此方法和try-except时处理引发的任何异常都是一个好主意。否则,您可能正在删除不想删除的目录或文件。
os.path.join()
该os.path
模块有许多用于常见路径名操作的有用方法。您可以使用它来查找有关目录名称和目录名称部分的信息。该模块还具有检查文件或目录是否存在的方法。
os.path.join()
通过将多个字符串连接到一个漂亮的文件路径,可以创建一个适用于大多数操作系统的路径.
这是文档中的描述:
智能地加入一个或多个路径组件。返回值是路径和*路径的任何成员的串联,os.sep
在每个非空部分之后只有一个目录separator(),除了最后一个....
基本上,如果您使用的是Unix或macOS系统,请os.path.join()
在您提供的每个字符串之间添加正斜杠(“/”)以创建路径。如果操作系统需要“”,则join知道使用反斜杠。
os.path.join()
还向其他开发人员提供了您正在创建路径的明确信息。绝对使用它而不是手动字符串连接,以避免看起来像一个菜鸟。
os.makedirs("dir1/dir2")
os.makedirs()
制作目录。该mkdir()
方法也可以创建目录,但它不会创建中间目录。所以我建议你使用os.makedirs()
。
shutil.copy2("source_file", "destination")
有许多方法可以在Python中复制文件和目录。shutil.copy2()
是一个很好的选择,因为它试图尽可能多地保留源文件的元数据。有关更多讨论,请参阅此文章。
shutil.move("source_file", "destination")
使用shutil.move()
更改文件的位置。它copy2
在引擎盖下用作默认值。os.remove("my_file_path")
有时您需要删除文件。os.remove()
是你的工具。
shutil.rmtree("my_directory_path")
shutil.rmtree()
删除目录及其中的所有文件和目录。
小心删除东西的功能!您可能希望使用print()打印将作为空运行删除的内容。然后在你确定它不会删除错误的文件时,在你的删除函数中运行print()。在使用Python自动化无聊的东西时,向Al Sweigart提出了这个想法。这是完整的列表。
10文件系统方法回顾
下面的列表遵循以下模式:方法 - 描述 - 等效的macOS Shell命令
获取信息
os.getcwd()
- 将当前工作目录路径作为字符串 - pwd
os.listdir()
- 获取当前工作目录的内容作为字符串列表 - ls
os.walk("starting_directory_path")
- 返回一个生成器,其中包含当前目录和所有子目录中的目录和文件的名称和路径信息 - 没有确切的短CLI等效,但ls -R
提供子目录名称和子目录中文件的名称改变一切os.chdir("/absolute/or/relative/path")
- 更改当前工作目录 - cd
os.path.join()
- 创建一个路径供以后使用 - 没有短的CLI等价物os.makedirs("dir1/dir2")
- 制作目录 - mkdir-ps
hutil.copy2("source_file_path", "destination_directory_path")
- 复制文件或目录 - cp
shutil.move("source_file_path", "destination_directory_path")
- 移动文件或目录 - mv
os.remove("my_file_path")
- 删除文件 - rm
shutil.rmtree("my_directory_path")
- 删除目录及其中的所有文件和目录 - rm -rf
Wrap
现在您已经看到了在Python中与文件系统交互的基础知识。在IPython解释器中尝试这些命令以获得快速反馈。然后向其他人解释它们以巩固您的知识。如果你在家里搬了一盒笔记本电脑,你就不那么痛了。 但是运动会很好,所以现在你可以去健身房了。 ️♀️
如果你想深入了解,请查看免费电子书自动化Python的无聊东西。
如果您想了解使用Python从文件中读取和写入,请查看ref="https://docs.python.org/3/library/functions.html#open">open函数。记得像这样使用上下文管理器: with open(‘myfile’) as file:
.
我希望你发现这个Python文件系统操作介绍很有用。如果您这样做,请在您最喜欢的社交媒体渠道上分享,以便其他人也可以找到它。
我写的是关于Python,Docker,数据科学等等。如果您对此感兴趣,请在此处阅读更多内容并按照我的说明进行操作。
谢谢阅读!