打开文件只知道其名称的一部分

时间:2013-08-25 20:06:51

标签: python naming

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

# 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 个答案:

答案 0 :(得分:13)

您可以使用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']

答案 1 :(得分:4)

同时查看fnmatch

>>> import fnmatch
>>> import os
>>>
>>> fnmatch.filter(os.listdir('.'), 'file_*.data')
['file_3453453.data']
>>>

答案 2 :(得分:2)

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

import os
import re
for file in os.listdir(mypath):
     if re.match("file_\d+\.data", file):
     ...

答案 3 :(得分: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]放在列表推导的末尾。