Use*_*YmY 96 python filesystems glob fnmatch
我想在文件夹中打开一系列子文件夹,找到一些文本文件并打印一些文本文件行.我用这个:
configfiles = glob.glob('C:/Users/sam/Desktop/file1/*.txt')
Run Code Online (Sandbox Code Playgroud)
但是这也无法访问子文件夹.有谁知道如何使用相同的命令来访问子文件夹?
Mar*_*ers 140
在Python 3.5和更新版本中使用新的递归**/
功能:
configfiles = glob.glob('C:/Users/sam/Desktop/file1/**/*.txt', recursive=True)
Run Code Online (Sandbox Code Playgroud)
当recursive
被设置时,**
随后是路径分隔匹配0或多个子目录.
在早期的Python版本中,glob.glob()
无法递归地列出子目录中的文件.
在那种情况下,我会os.walk()
结合使用fnmatch.filter()
:
import os
import fnmatch
path = 'C:/Users/sam/Desktop/file1'
configfiles = [os.path.join(dirpath, f)
for dirpath, dirnames, files in os.walk(path)
for f in fnmatch.filter(files, '*.txt')]
Run Code Online (Sandbox Code Playgroud)
这将以递归方式遍历您的目录并将所有绝对路径名返回给匹配的.txt
文件.在这个特定的情况下,fnmatch.filter()
可能是矫枉过正,你也可以使用.endswith()
测试:
import os
path = 'C:/Users/sam/Desktop/file1'
configfiles = [os.path.join(dirpath, f)
for dirpath, dirnames, files in os.walk(path)
for f in files if f.endswith('.txt')]
Run Code Online (Sandbox Code Playgroud)
jfs*_*jfs 18
要在直接子目录中查找文件:
configfiles = glob.glob(r'C:\Users\sam\Desktop\*\*.txt')
Run Code Online (Sandbox Code Playgroud)
对于遍历所有子目录的递归版本,您可以使用**
并传递recursive=True
自Python 3.5:
configfiles = glob.glob(r'C:\Users\sam\Desktop\**\*.txt', recursive=True)
Run Code Online (Sandbox Code Playgroud)
两个函数调用返回列表.您可以使用glob.iglob()
逐个返回路径.或使用pathlib
:
from pathlib import Path
path = Path(r'C:\Users\sam\Desktop')
txt_files_only_subdirs = path.glob('*/*.txt')
txt_files_all_recursively = path.rglob('*.txt') # including the current dir
Run Code Online (Sandbox Code Playgroud)
两种方法都返回迭代器(您可以逐个获取路径).
meg*_*wac 17
该glob2包支持通配符和相当快
code = '''
import glob2
glob2.glob("files/*/**")
'''
timeit.timeit(code, number=1)
Run Code Online (Sandbox Code Playgroud)
在我的笔记本电脑上,匹配> 60,000个文件路径大约需要2秒钟.
您可以在Python 2.6中使用Formic
import formic
fileset = formic.FileSet(include="**/*.txt", directory="C:/Users/sam/Desktop/")
Run Code Online (Sandbox Code Playgroud)
披露 - 我是这个包的作者.
在这个话题上有很多困惑。让我看看是否可以澄清它(Python 3.7):
glob.glob('*.txt') :
匹配当前目录中所有以“ .txt”结尾的文件glob.glob('*/*.txt') :
与1相同glob.glob('**/*.txt') :
仅匹配直接子目录中所有以'.txt'结尾的文件,而不匹配当前目录中的所有文件glob.glob('*.txt',recursive=True) :
与1相同glob.glob('*/*.txt',recursive=True) :
与3相同glob.glob('**/*.txt',recursive=True):
匹配当前目录和所有子目录中所有以“ .txt”结尾的文件所以最好总是指定 recursive=True.
归档时间: |
|
查看次数: |
152012 次 |
最近记录: |