python生成word目录_Python 文件与目录操作方法总结

Python 有很多内置的模块和函数可用于文件的操作处理,这些函数都分布在几个模块上:如 os,os.path,shutil 和pathlib 等等。本文收集了许多您需要知道的函数,以便在 Python 中对文件执行最常见的操作。

通过本教程,你可以:

检索文件属性创建目录基于文件名的模式匹配遍历目录树创建临时文件和目录删除文件和目录拷贝、转移、重命名文件和目录创建和提取 ZIP 和 TAR 打包使用fileinput模块打开多个文件Python 读写数据到文件

使用 Python 读取和写入文件数据非常简单。 为此,我们必须首先以适当的模式打开文件。 以下是如何打开文本文件并读取其内容的示例:

with open('data.txt', 'r') as f: data = f.read()open() 接受文件名和模式作为参数。 r 是以只读模式打开文件。如果要将数据写入文件,请将w作为参数传入:

with open('data.txt', 'w') as f:data = 'some data to be written to the file' f.write(data)在上面的示例中,open() 打开用于读取或写入的文件,并返回文件句柄(在本例中为 f),该句柄提供可用于读取或写入文件数据的方法。 更多有关如何读取和写入文件的更多信息,参考:Working With File I/O in Python 。

获取目录列表

假设您当前的工作目录有一个名为 my_directory 的子目录,其中包含以下内容:

.├── file1.py├── file2.csv├── file3.txt├── sub_dir│ ├── bar.py│ └── foo.py├── sub_dir_b│ └── file4.txt└── sub_dir_c ├── config.py └── file5.txt内置的os模块有许多有用的功能,可用于列出目录内容并过滤结果。 要获取文件系统中特定目录下的所有文件和文件夹的列表,请在旧版本的 Python 中使用os.listdir();或在 Python 3.x 中使用os.scandir()。 如果你还想获取文件和目录属性(如文件大小和修改日期),则os.scandir()是首选方法。

在传统 Python 版本中获取目录列表

在 Python 3 之前的 Python 版本中,os.listdir() 是用于获取目录列表的方法:

>>> import os>>> entries = os.listdir('my_directory/')os.listdir() 返回一个 Python 列表,其中包含 path 参数下目录中的文件和子目录的名称:

>>> os.listdir('my_directory/')['sub_dir_c', 'file1.py', 'sub_dir_b', 'file3.txt', 'file2.csv', 'sub_dir']像这样列出的目录列表不容易阅读。使用循环打印出对os.listdir()的调用输出,有助于(后续的目录和文件)清理:

>>> entries = os.listdir('my_directory/')>>> for entry in entries:... print(entry)......sub_dir_cfile1.pysub_dir_bfile3.txtfile2.csvsub_dir在现代 Python 版本中的获取目录列表

在现代版本的 Python 中,os.listdir()的替代方法是使用os.scandir()和pathlib.Path()。

os.scandir() 是在 Python 3.5 中引入的,并在 PEP 471 中有记录。os.scandir()在调用时返回一个迭代器(iterator)而不是列表:

>>> import os>>> entries = os.scandir('my_directory/')>>> entriesScandirIterator 对象指向当前目录中的所有条目。我们可以遍历迭代器的内容并打印出文件名:

import oswith os.scandir('my_directory/') as entries:for entry in entries: print(entry.name)在这里,os.scandir()与with语句一起使用,因为它支持上下文管理器协议(the context manager protocol)。 使用上下文管理器可以关闭迭代器并在迭代器耗尽后自动释放获取的资源。 结果是打印出 my_directory 中的文件名,就像在os.listdir()示例中看到的那样:

sub_dir_cfile1.pysub_dir_bfile3.txtfile2.csvsub_dir获取目录列表的另一种方法是使用pathlib模块:

from pathlib import Pathentries = Path('my_directory/')for entry in entries.iterdir():print(entry.name)Path 方法返回的对象是 PosixPath 或 WindowsPath 对象,具体取决于操作系统。

pathlib.Path()对象具有.iterdir()方法,用于创建目录中所有文件和文件夹的迭代器。 由.iterdir()生成的每个条目都包含有关文件或目录的信息,例如其名称和文件属性。pathlib最初是在 Python 3.4 中引入的,是 Python 的一个很好的补充,它为文件系统提供了面向对象的接口。

在上面的示例中,我们调用pathlib.Path()并将路径参数传递给它。接下来是调用.iterdir()来获取 my_directory 中所有文件和目录的列表。

pathlib提供了一组类,它们以简单,面向对象的方式展现了基于路径的大多数常见操作。 使用pathlib比使用os中的函数更有效。 使用pathlib 相比于os的另一个好处是它减少了操作文件系统路径时所需的导入数量。更多相关信息,请阅读:Python 3’s pathlib Module: Taming the File System。

运行上面的代码会产生以下结果:

sub_dir_cfile1.pysub_dir_bfile3.txtfile2.csvsub_dir使用pathlib.Path()或os.scandir()而不是os.listdir()是获取目录列表的首选方法,尤其是在处理需要文件类型和文件属性信息的代码时。 pathlib.Path()提供了os和shutil中的大部分文件和路径处理功能,它的方法比这些模块中的方法更有效。 接下来我们将讨论如何快速获取文件属性。

以下是目录列表功能:

30adcbef76094b36436868df7e321fdd8c109d09.png?token=cdd0d51078b4661a10bf7f5194124623&s=08205C32C5764D204AE155CF0000D0B2

directory_list_functions.png这些函数返回了一个包含了目录中所有内容的列表,包括子目录。这些操作可能并不总是您想要的。下一节我们将介绍如何从目录列表中进行结果过滤。

列出目录中的所有文件

本节将向您展示如何使用os.listdir(),os.scandir()和pathlib.Path()打印出目录中文件的名称。 如果我们要过滤目录并仅列出由os.listdir()得到的目录列表中的文件,请使用os.path:

import os# List all files in a directory using os.listdirbasepath = 'my_directory/'for entry inos.listdir(basepath):ifos.path.isfile(os.path.join(basepath, entry)):print(entry)在这里,对os.listdir()的调用返回了指定路径中的所有内容列表,然后使用os.path.isfile()过滤该列表,只打印出文件而不是目录。这会产生以下输出:

file1.pyfile3.txtfile2.csv列出目录中文件的一个更简单方法是使用os.scandir()或pathlib.Path():

import os# List all files in a directory using scandir()basepath = 'my_directory/'with os.scandir(basepath) as entries:for entry in entries:if entry.is_file(): print(entry.name)使用os.scandir()比使用os.listdir()具有更清晰,更容易理解的优点,即使它是一行更长的代码。如果对象是文件,则对 ScandirIterator 中的每个 item 调用 entry.is_file() 将返回True的结果。打印出目录中所有文件的名称可以得到以下输出:

file1.pyfile3.txtfile2.csv以下是使用pathlib.Path()列出目录中文件的方法:

from pathlib import Pathbasepath = Path('my_directory/')files_in_basepath = basepath.iterdir()for item in files_in_basepath:if item.is_file():print(item.name)在这里,我们在.iterdir()产生的每个 item 上调用.is_file()。 产生的输出是相同的:

file1.pyfile3.txtfile2.csv如果将 for 循环和 if 语句组合成单个生成器表达式,则上面的代码可以更简洁。 Dan Bader 有一篇关于生成器表达式(generator expressions)和列表推导(list comprehensions)的优秀文章,感兴趣的可以去看一下。

上面的代码,经修改后的版本如下所示:

from pathlib import Path# List all files in directory using pathlibbasepath = Path('my_directory/')files_in_basepath = (entry for entry in basepath.iterdir() if entry.is_file())for item in files_in_basepath:print(item.name)这将产生与之前的示例完全相同的输出。本节展示了使用os.scandir()和pathlib.Path()过滤文件或目录,它们比使用os.listdir()和os.path更直观,看起来更干净。

列出子目录

要列出子目录而不是文件,请使用以下方法之一。

如何使用os.listdir()和os.path():

import os# List all subdirectories using os.listdirbasepath = 'my_directory/'for entry inos.listdir(basepath):ifos.path.isdir(os.path.join(basepath, entry)):print(entry)当您多次调用os.path.join()时,以这种方式操作文件系统路径很快就会变得很麻烦。在我的计算机上运行它会产生以下输出:

sub_dir_csub_dir_bsub_dir如何使用os.scandir():

import os# List all subdirectories using scandir()basepath = 'my_directory/'with os.scandir(basepath) as entries:for entry in entries:if entry.is_dir(): print(entry.name)与文件列表示例中一样,此处在os.scandir()返回的每个条目上调用.is_dir()。 如果条目是目录,则.is_dir()返回True,并打印出目录的名称。输出与上面相同:

sub_dir_csub_dir_bsub_dir如何使用pathlib.Path():

from pathlib import Path# List all subdirectory using pathlibbasepath = Path('my_directory/')for entry in basepath.iterdir():if entry.is_dir():print(entry.name)本示例在 basepath 迭代器的每个条目上调用.is_dir()检查条目是文件还是目录 如果条目是目录,则将其名称打印到屏幕上。本示例输出与上一示例中的输出相同:

sub_dir_csub_dir_bsub_dir获取文件属性

Python 可以轻松检索文件大小和修改时间等文件属性。这是通过os.stat(),os.scandir()或pathlib.Path()完成的。

os.scandir()和pathlib.Path()检索具有文件属性组合的目录列表。这可能比使用os.listdir()列出文件然后获取每个文件的文件属性信息更有效。

下面的示例显示了如何获取 my_directory 中文件的上次修改时间。输出以秒为单位:

>>> import os>>> with os.scandir('my_directory/') as dir_contents:... for entry in dir_contents:... info = entry.stat()... print(info.st_mtime)...1539032199.00520351539032469.63244751538998552.24029231540233322.40093161537192240.04973391540266380.3434134os.scandir()返回一个 ScandirIterator 对象。ScandirIterator 对象中的每个条目都有一个.stat()方法,用于检索有关其指向的文件或目录的信息。.stat()提供文件大小和上次修改时间等信息。在上面的示例中,代码打印出 st_mtime 属性ÿ

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值