我正在阅读一个文件并使用以下行导入其中的数据:
# 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
中执行此操作?
答案 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]
放在列表推导的末尾。