使用通配符搜索文件

发布于 2024-09-11 12:06:06 字数 198 浏览 5 评论 0原文

我想要获取带有通配符搜索模式的文件名列表。比如:

getFilenames.py c:\PathToFolder\*
getFilenames.py c:\PathToFolder\FileType*.txt
getFilenames.py c:\PathToFolder\FileTypeA.txt

我该怎么做?

I want get a list of filenames with a search pattern with a wildcard. Like:

getFilenames.py c:\PathToFolder\*
getFilenames.py c:\PathToFolder\FileType*.txt
getFilenames.py c:\PathToFolder\FileTypeA.txt

How can I do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

往事风中埋 2024-09-18 12:06:06

您可以这样做:

>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']

注意
如果目录包含以 . 开头的文件,默认情况下它们不会匹配。例如,考虑一个包含 card.gif.card.gif 的目录:

>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']

这直接来自这里:http://docs.python.org/library/glob.html

You can do it like this:

>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']

Note:
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']

This comes straight from here: http://docs.python.org/library/glob.html

我的奇迹 2024-09-18 12:06:06

如果您在 python 中执行此操作,则 glob 很有用,但是,您的 shell 可能不会传入 * (我不熟悉 Windows shell)。

例如,当我执行以下操作时:

import sys
print sys.argv

在我的 shell 上,输入:

$ python test.py *.jpg

我得到:

['test.py', 'test.jpg', 'wasp.jpg']

注意 argv 不包含 "*.jpg"

这里重要的教训是大多数 shell 都会在将星号传递给您的应用程序之前展开 shell 中的星号

在这种情况下,要获取文件列表,我只需执行 sys.argv[1:] 即可。或者,您可以转义 *,以便 python 看到文字 *。然后,您可以使用 glob 模块。

$ getFileNames.py "*.jpg"

或者

$ getFileNames.py \*.jpg

glob is useful if you are doing this in within python, however, your shell may not be passing in the * (I'm not familiar with the windows shell).

For example, when I do the following:

import sys
print sys.argv

On my shell, I type:

$ python test.py *.jpg

I get this:

['test.py', 'test.jpg', 'wasp.jpg']

Notice that argv does not contain "*.jpg"

The important lesson here is that most shells will expand the asterisk at the shell, before it is passed to your application.

In this case, to get the list of files, I would just do sys.argv[1:]. Alternatively, you could escape the *, so that python sees the literal *. Then, you can use the glob module.

$ getFileNames.py "*.jpg"

or

$ getFileNames.py \*.jpg
烟凡古楼 2024-09-18 12:06:06

如果您使用的是 Python 3.5+,则可以使用 pathlib< /a> 的 glob() 而不是单独的 glob 模块。

获取目录中的所有文件如下所示:

from pathlib import Path
for path in Path("/path/to/directory").glob("*"):
    print(path)

或者,要只是获取目录中所有.txt文件的列表,您可以这样做:

from pathlib import Path
for path in Path("/path/to/directory").glob("*.txt"):
    print(path)

最后,您可以搜索使用通配符目录递归地(即,查找目标目录所有子目录中的所有 .txt 文件):

from pathlib import Path
for path in Path("/path/to/directory").glob("**/*.txt"):
    print(path)

If you're on Python 3.5+, you can use pathlib's glob() instead of the glob module alone.

Getting all files in a directory looks like this:

from pathlib import Path
for path in Path("/path/to/directory").glob("*"):
    print(path)

Or, to just get a list of all .txt files in a directory, you could do this:

from pathlib import Path
for path in Path("/path/to/directory").glob("*.txt"):
    print(path)

Finally, you can search recursively (i.e., to find all .txt files in your target directory and all subdirectories) using a wildcard directory:

from pathlib import Path
for path in Path("/path/to/directory").glob("**/*.txt"):
    print(path)
白云不回头 2024-09-18 12:06:06
from glob import glob
import sys

files = glob(sys.argv[1])
from glob import glob
import sys

files = glob(sys.argv[1])
维持三分热 2024-09-18 12:06:06

我将其添加到前面的内容中,因为我发现当您希望脚本在多个 shell 上运行并使用 * 具有多个参数时,这非常有用。

如果您想要在每个 shell 上运行的东西,您可以执行以下操作(仍然使用 glob):

>>> import glob
>>> from functools import reduce # if using python 3+
>>> reduce(lambda r, x: r + glob.glob(x), sys.argv[1:], [])

请注意,它可能会产生重复(如果您有一个 test 文件并且您给 t*te*),但您可以简单地使用 set 删除它们:

>>> set(reduce(lambda r, x: r + glob.glob(x), sys.argv[1:], []))

I am adding this to the previous because I found this very useful when you want your scripts to work on multiple shell and with multiple parameters using *.

If you want something that works on every shells, you can do the following (still using glob):

>>> import glob
>>> from functools import reduce # if using python 3+
>>> reduce(lambda r, x: r + glob.glob(x), sys.argv[1:], [])

Note that it can produce duplicate (if you have a test file and you give t* and te*), but you can simply remove them using a set:

>>> set(reduce(lambda r, x: r + glob.glob(x), sys.argv[1:], []))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文