Python中列出目录中的文件方法有哪些
这篇文章主要介绍了Python中列出目录中的文件方法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python中列出目录中的文件方法有哪些文章都会有所收获,下面我们一起来看看吧。
1. 引言
文件和目录相关操作是软件工程师必备的基本技能。
我不是说将一个文件复制到Windows文件资源管理器上的另一个文件夹中。
我是说使用代码来进行自动化批量处理操作。
今天,我们将深入探讨一个具体问题:
如何根据需要列出特定目录下的所有文件名?
我将介绍5种用Python实现的方法。不同的方法适用于不同的使用场景。
2. 使用os.listdir()
使用Python中的os模块下的方法listdir()是一个不错的选择,样例如下:
>>> import os>>> os.listdir()
上面的代码将打印当前路径下所有文件和目录的名称。
如果我们想基于特定路径来打印结果,只需传递给函数os.listdir() 相应的参数,举例如下:
>>> os.listdir(myPath)
如果我们只想打印所有文件不包含目录,那么我们可以使用os.path.isfile() 来进行相应的过滤,如下:
>>> import os>>> files = [f for f in os.listdir() if os.path.isfile(f)]
当然,对于目录,同样可以使用函数os.path.isdir() 进行过滤,代码如下:
import osfiles = [f for f in os.listdir() if os.path.isdir(f)]
如果我们只需要特定类型的文件怎么办?
完全不用担心。Python为复杂场景提供了更多选择。
3. 使用os.walk()
os模块中还有另一个方法 os.walk() 。顾名思义,它可以一层一层地“遍历”目录树。当我们调用os.walk() 函数时,它将返回一个生成器。此时每次调用next() 方法生成下一个值时,它都会进入到一个layer ,结果是一个包含3个项的元组:(dirpath、dirname、filename) 。
举例,如果要获取第二层中所有文件夹的名称,代码如下所示:
from os import walkf = []layer = 1w = walk("/Users/zhao")for (dirpath, dirnames, filenames) in w: if layer == 2: f.extend(dirnames) break layer += 1
4. 在Glob模块中使用正则表达式
有时我们不想获取所有文件的名称,而是希望精确获取特定类型文件的名称。
由于glob模块能够添加用于搜索的正则表达式,因此它将是我们进行此类操作的首选。
>>> import glob>>> glob.glob("/sys/*.log")
上面的代码将列出以log 结尾的文件名。
5. 使用pathlib
从Python 3.4开始,有一个名为pathlib 的模块也很有用。
借助列表生成式的技巧,我们只需使用一行代码即可生成当前路径的所有文件名:
import pathlibfiles = [f for f in pathlib.Path().iterdir() if f.is_file()]
令人奇怪的是,Path() 还附带了glob() 函数。(无需在Python文件顶部显式导入glob模块)
import pathlibfiles = [f for f in pathlib.Path().glob("/sys/*.log")]
6. 使用os.scandir()
经典的os.listdir() 函数很直观,但对于包含大量文件的大型目录来说效率并不高。因此,Python 3.5引入了一个新的功能类似的函数os.scandir() 。
是的,有的同学可能已经猜到了。此函数将返回一个生成器,并不是所有名称的列表。在某些情况下,我们并不需要同时获取所有名称,此时会更有效。
>>> a=os.scandir()>>> next(a)<DirEntry 'test1.py'>>>> next(a)<DirEntry 'test2.py'>
关于“Python中列出目录中的文件方法有哪些”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Python中列出目录中的文件方法有哪些”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341