2013-08-25 31 views
4

的一部分,我目前正在讀文件,並在其與線導入數據:打開文件只知道它的名字

# 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有沒有辦法做到這一點?

+1

如果有多個文件應該發生什麼有那個名字? – delnan

+0

在該路徑中始終只有該名稱的一個文件。對不起,我沒有明確說明,現在我會更新問題。 – Gabriel

+0

那麼,崩潰和燒傷?我知道這很不方便,但至少應該知道如果這樣的假設被破壞會發生什麼。因爲它*會被打破。 – delnan

回答

13

可以使用glob模塊。它允許在文件名模式匹配,並做你問什麼

import glob 

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

e.g我有一個名爲google.xml,google.json和google.csv文件的目錄。

我可以使用水珠像這樣:

>>> 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'] 
+0

這似乎是一個很好的答案,但是它允許將文件的末尾部分設置爲匹配模式'file * .data'還是隻使用文件名的第一部分? Sp的答案使用'fnmatch'可以做我正在談論的事情。 – Gabriel

+0

glob使用fnmatch,所以它也匹配其他模式,如文件* .data。我編輯了答案來證明這一點 – MrD

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]

2

我簡單的解決辦法是使用Python模塊「OS」和「重」:

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

你需要逃避模式中的'.'。 – iCodez

+0

你是對的!固定。如果不轉義,代碼將會匹配同名文件 - 「file_123data」。謝謝! – go2

4

還檢查了fnmatch

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