题 在Python中查找扩展名为.txt的目录中的所有文件


如何查找具有扩展名的目录中的所有文件 .txt 在python?


1044
2017-10-19 01:09


起源




答案:


您可以使用 glob

import glob, os
os.chdir("/mydir")
for file in glob.glob("*.txt"):
    print(file)

或简单地说 os.listdir

import os
for file in os.listdir("/mydir"):
    if file.endswith(".txt"):
        print(os.path.join("/mydir", file))

或者如果要遍历目录,请使用 os.walk

import os
for root, dirs, files in os.walk("/mydir"):
    for file in files:
        if file.endswith(".txt"):
             print(os.path.join(root, file))

1660
2017-10-19 01:12



使用解决方案#2,您将如何使用该信息创建文件或列表? - Merlin
@ ghostdog74:在我看来,编写更合适 for file in f 而不是 for files in f 因为变量中的内容是单个文件名。更好的是改变 f 至 files 然后for循环就可以了 for file in files。 - martineau
@computermacgyver:不, file 不是保留字,只是预定义函数的名称,因此很可能在自己的代码中将其用作变量名。虽然通常人们应该避免这样的碰撞, file 是一个特例,因为几乎没有必要使用它,因此通常认为该指南是一个例外。如果您不想这样做,PEP8建议在这些名称后附加一个下划线,即 file_,你必须同意仍然很可读。 - martineau
谢谢,马蒂诺,你说得对。我跳得太快得出结论。 - computermacgyver
#2的更多Pythonic方式可以 如果f.endswith('。txt')]中的文件在[f for os in os.listdir('/ mydir')中: - ozgur


使用 glob的

>>> import glob
>>> glob.glob('./*.txt')
['./outline.txt', './pip-log.txt', './test.txt', './testingvim.txt']

180
2017-10-19 01:11



这不仅容易,而且也不区分大小写。 (至少,它在Windows上,应该是。我不确定其他操作系统。) - Jon Coombs
要小心 glob 找不到文件 递归 如果你的python低于3.5。 更多信息 - qun
最好的部分是你可以使用正则表达式测试* .txt - Alex Punnen


这样的事情应该可以胜任

for root, dirs, files in os.walk(directory):
    for file in files:
        if file.endswith('.txt'):
            print file

115
2017-10-19 01:11



+1用于命名变量 root, dirs, files 代替 r, d, f。更具可读性。 - Clément
请注意,这是区分大小写的(与.TXT或.Txt不匹配),因此如果file.lower()。endswith('。txt'),您可能会想要这样做: - Jon Coombs
你的答案处理子目录。 - Sam Liao


这样的东西会起作用:

>>> import os
>>> path = '/usr/share/cups/charmaps'
>>> text_files = [f for f in os.listdir(path) if f.endswith('.txt')]
>>> text_files
['euc-cn.txt', 'euc-jp.txt', 'euc-kr.txt', 'euc-tw.txt', ... 'windows-950.txt']

88
2017-10-19 01:13



我如何保存text_files的路径? ['path / euc-cn.txt',...'path / windows-950.txt'] - IceQueeny
你可以用 os.path.join 在每个元素上 text_files。它可能是这样的 text_files = [os.path.join(path, f) for f in os.listdir(path) if f.endswith('.txt')]。 - Seth


我喜欢 os.walk()

import os, os.path

for root, dirs, files in os.walk(dir):
    for f in files:
        fullpath = os.path.join(root, f)
        if os.path.splitext(fullpath)[1] == '.txt':
            print fullpath

或者使用发电机:

import os, os.path

fileiter = (os.path.join(root, f)
    for root, _, files in os.walk(dir)
    for f in files)
txtfileiter = (f for f in fileiter if os.path.splitext(f)[1] == '.txt')
for txt in txtfileiter:
    print txt

25
2017-10-19 01:27





import os

path = 'mypath/path' 
files = os.listdir(path)

files_txt = [i for i in files if i.endswith('.txt')]

24
2017-07-14 18:29





这里有更多相同版本会产生稍微不同的结果:

glob.iglob()

import glob
for f in glob.iglob("/mydir/*/*.txt"): # generator, search immediate subdirectories 
    print f

glob.glob1()

print glob.glob1("/mydir", "*.tx?")  # literal_directory, basename_pattern

fnmatch.filter()

import fnmatch, os
print fnmatch.filter(os.listdir("/mydir"), "*.tx?") # include dot-files

21
2017-10-19 18:41



对于好奇, glob1() 是一个辅助函数 glob Python文档中未列出的模块。有一些内联注释描述了它在源文件中的作用,请参阅 .../Lib/glob.py。 - martineau
@martineau: glob.glob1() 不公开,但可以在Python 2.4-2.7; 3.0-3.2; pypy; Jython的 github.com/zed/test_glob1 - jfs
谢谢,在决定是否在模块中使用未记录的私有函数时,这是一个很好的附加信息。 ;-)这里还有一点。 Python 2.7版本只有12行长,看起来很容易从中提取 glob模块。 - martineau


path.py是另一种选择: https://github.com/jaraco/path.py

from path import path
p = path('/path/to/the/directory')
for f in p.files(pattern='*.txt'):
    print f

17
2017-12-22 08:47



很酷,它也接受正则表达式。我在用着 for f in p.walk(pattern='*.txt') 浏览每个子文件夹 - Kostanos
雅也有路径。你可以这样做: list(p.glob('**/*.py')) - user2233949


Python有所有工具可以做到这一点:

import os

the_dir = 'the_dir_that_want_to_search_in'
all_txt_files = filter(lambda x: x.endswith('.txt'), os.listdir(the_dir))

10
2017-08-30 06:51



如果你想all_txt_files是一个列表: all_txt_files = list(filter(lambda x: x.endswith('.txt'), os.listdir(the_dir))) - Ena