Python 3.6 glob 包含隐藏文件和文件夹
Python 3.6 glob include hidden files and folders
我尝试遍历所有匹配特定扩展名的文件,包括隐藏文件夹中的文件。到目前为止,我还没有找到使用 iglob
执行此操作的方法。
这适用于所有文件夹,但以点开头的文件夹除外:
import glob
for filename in glob.iglob('/path/**/*.ext', recursive=True):
print(filename)
我尝试将点添加为可选字符但无济于事。我真的很想使用 glob
而不是居住在 os.walk
.
如何包含所有 files/folders,甚至包括以 .
、glob
开头的那些?
来自https://docs.python.org/3/library/glob.html
Note that unlike fnmatch.fnmatch(), glob treats filenames beginning with a dot (.) as special cases
If the directory contains files starting with . they won’t be matched
by default. For example, consider a directory containing card.gif and
.card.gif:
import glob
glob.glob('*.gif') # ['card.gif']
glob.glob('.c*') # ['.card.gif']
据我所知,它需要两个单独的 glob 来同时隐藏和不隐藏,例如使用 .
我遇到了同样的问题,希望 glob.glob 有一个可选参数来包含点文件。我希望能够将所有点文件包含在所有目录中,包括以点开头的目录。用 glob.glob 做这件事是不可能的。但是我发现 Python 有 pathlib 标准模块,它有一个运行不同的 glob 函数,它将包含点文件。该函数的操作略有不同,特别是它不是 return 字符串列表,而是路径对象。但是我使用了以下
files=[]
file_refs = pathlib.Path(".").glob(pattern)
for file in file_refs:
files.append(str(file))
我发现的另一个显着差异是以 ** 结尾的 glob 模式。此 return 在 pathlib 版本中没有任何内容,但会 return glob.glob 版本中的所有文件。为了获得相同的结果,我添加了一行来检查模式是否以 ** 结尾,如果是,则将 /* 附加到它。
以下代码替换了您的示例,其中包含以点开头的目录中的文件
import pathlib
for fileref in pathlib.Path('/path/').glob('**/*.ext'):
filename = str(fileref)
print(filename)
添加赏金问题的答案;在单个命令中获取隐藏和非隐藏文件的结果。
正如@reducidng activity 提到的,glob 对待 .文件作为特殊用例。要在单个循环中同时获取常规文件和隐藏文件,我们可以使用 itertools.chain
和 glob.iglob
迭代器。例如,
→ ls -A
.chen file.text so1.py
>>> import glob, itertools
>>> for i in itertools.chain(glob.iglob('**'), glob.iglob('.**')):
... print(i)
...
file.text
so1.py
.chen
# If you want it as a variable, you can list() it.
>>> l = list(itertools.chain(glob.iglob('**'), glob.iglob('.**')))
>>> l
['file.text', 'so1.py', '.chen']
>>>
注意:它还不能完全工作(还)。假设您有 .hello
、.dot/hello.txt
、.dot/.hello.txt
、nodot/hello.txt
、nodot/.hello.txt
。那么都不是:
itertools.chain(glob.iglob('**', recursive=True), glob.iglob('.**', recursive=True))
也不
itertools.chain(glob.iglob('**/*', recursive=True), glob.iglob('.**/*', recursive=True))
给出所有文件。
要查找与特定扩展名匹配的隐藏文件,您可以试试这个
glob.glob('/path/**/.*.ext')
如果要查找文件夹中的所有文件
glob.glob('/path/*') + glob.glob('/path/.*')
我尝试遍历所有匹配特定扩展名的文件,包括隐藏文件夹中的文件。到目前为止,我还没有找到使用 iglob
执行此操作的方法。
这适用于所有文件夹,但以点开头的文件夹除外:
import glob
for filename in glob.iglob('/path/**/*.ext', recursive=True):
print(filename)
我尝试将点添加为可选字符但无济于事。我真的很想使用 glob
而不是居住在 os.walk
.
如何包含所有 files/folders,甚至包括以 .
、glob
开头的那些?
来自https://docs.python.org/3/library/glob.html
Note that unlike fnmatch.fnmatch(), glob treats filenames beginning with a dot (.) as special cases
If the directory contains files starting with . they won’t be matched by default. For example, consider a directory containing card.gif and .card.gif:
import glob glob.glob('*.gif') # ['card.gif'] glob.glob('.c*') # ['.card.gif']
据我所知,它需要两个单独的 glob 来同时隐藏和不隐藏,例如使用 .
我遇到了同样的问题,希望 glob.glob 有一个可选参数来包含点文件。我希望能够将所有点文件包含在所有目录中,包括以点开头的目录。用 glob.glob 做这件事是不可能的。但是我发现 Python 有 pathlib 标准模块,它有一个运行不同的 glob 函数,它将包含点文件。该函数的操作略有不同,特别是它不是 return 字符串列表,而是路径对象。但是我使用了以下
files=[]
file_refs = pathlib.Path(".").glob(pattern)
for file in file_refs:
files.append(str(file))
我发现的另一个显着差异是以 ** 结尾的 glob 模式。此 return 在 pathlib 版本中没有任何内容,但会 return glob.glob 版本中的所有文件。为了获得相同的结果,我添加了一行来检查模式是否以 ** 结尾,如果是,则将 /* 附加到它。
以下代码替换了您的示例,其中包含以点开头的目录中的文件
import pathlib
for fileref in pathlib.Path('/path/').glob('**/*.ext'):
filename = str(fileref)
print(filename)
添加赏金问题的答案;在单个命令中获取隐藏和非隐藏文件的结果。
正如@reducidng activity 提到的,glob 对待 .文件作为特殊用例。要在单个循环中同时获取常规文件和隐藏文件,我们可以使用 itertools.chain
和 glob.iglob
迭代器。例如,
→ ls -A
.chen file.text so1.py
>>> import glob, itertools
>>> for i in itertools.chain(glob.iglob('**'), glob.iglob('.**')):
... print(i)
...
file.text
so1.py
.chen
# If you want it as a variable, you can list() it.
>>> l = list(itertools.chain(glob.iglob('**'), glob.iglob('.**')))
>>> l
['file.text', 'so1.py', '.chen']
>>>
注意:它还不能完全工作(还)。假设您有 .hello
、.dot/hello.txt
、.dot/.hello.txt
、nodot/hello.txt
、nodot/.hello.txt
。那么都不是:
itertools.chain(glob.iglob('**', recursive=True), glob.iglob('.**', recursive=True))
也不
itertools.chain(glob.iglob('**/*', recursive=True), glob.iglob('.**/*', recursive=True))
给出所有文件。
要查找与特定扩展名匹配的隐藏文件,您可以试试这个
glob.glob('/path/**/.*.ext')
如果要查找文件夹中的所有文件
glob.glob('/path/*') + glob.glob('/path/.*')