9

我目前正在读取一个文件并使用以下行导入其中的数据:

# Read data from file.
data = np.loadtxt(join(mypath, 'file.data'), unpack=True)

其中变量mypath是已知的。问题是文件file.data会随着时间而改变,假设名称如下:

file_3453453.data
file_12324.data
file_987667.data
...

所以我需要一种方法来告诉代码打开该路径中名称为 的文件file*.data,假设路径中始终只有一个该名称的文件。有没有办法做到这一点python

4

4 回答 4

16

您可以使用该glob模块。它允许对文件名进行模式匹配,并且完全符合您的要求

import glob

for fpath in glob.glob(mypath):
    print fpath

例如,我有一个目录,其中包含名为 google.xml、google.json 和 google.csv 的文件。

我可以像这样使用 glob:

>>> import glob
>>> glob.glob('g*gle*')
['google.json', 'google.xml', 'google.csv']

请注意,它glob使用了该fnmatch模块,但它具有更简单的界面,并且它匹配路径而不是仅匹配文件名。

您可以搜索相对路径,而不必使用os.path.join. 在上面的示例中,如果我更改到父目录并尝试匹配文件名,它会返回相对路径:

>>> import os
>>> import glob
>>> os.chdir('..')
>>> glob.glob('foo/google*')
['foo/google.json', 'foo/google.xml', 'foo/google.csv']
于 2013-08-25T20:16:58.357 回答
5

另请查看fnmatch

>>> import fnmatch
>>> import os
>>>
>>> fnmatch.filter(os.listdir('.'), 'file_*.data')
['file_3453453.data']
>>>
于 2013-08-25T20:20:11.420 回答
2

我简单的解决方案是使用 python 模块“os”和“re”:

import os
import re
for file in os.listdir(mypath):
     if re.match("file_\d+\.data", file):
     ...
于 2013-08-25T20:14:33.763 回答
1

尝试

import os

[os.path.join(root, f) for root, _, files in os.walk(mypath)
                       for f in files
                       if f.startswith('file') and f.endswith('.data')]

file*.data如果有多个文件,它将返回所有文件的列表。你可以遍历它们。如果只有一个文件,则只需将其放在[0]列表理解的末尾即可。

于 2013-08-25T20:12:09.167 回答