2017-02-28 91 views
1

我有一系列文件,這些文件是按以下格式:Python的遍歷多個文件

file_1991.xlsx 
file_1992.xlsx 
# there are some gaps in the file numbering sequence 
file_1995.xlsx 
file_1996.xlsx 
file_1997.xlsx 

因爲我想這樣做的每個文件:

import pandas as pd 
data_1995 = pd.read_excel(open(directory + 'file_1995', 'rb'), sheetname = 'Sheet1') 

做了一些工作數據,並將其保存爲其他文件:

output_1995 = pd.ExcelWriter('output_1995.xlsx') 
data_1995.to_excel(output_1995,'Sheet1') 

而不是做所有這些對於每一個文件的,我怎麼能經過多個迭代文件並在多個文件中重複相同的操作?換句話說,我想遍歷所有的文件(它們主要遵循名稱中的數字序列,但序列中存在一些空白)。

感謝您的幫助提前。

回答

1

你應該使用Python的glob模塊:https://docs.python.org/3/library/glob.html

例如:

import glob 
for path in glob.iglob(directory + "file_*.xlsx"): 
    pd.read_excel(path) 
    # ... 
+0

謝謝!我可以使用'glob'模塊來分配變量名嗎?例如,我需要通過分配類似如下內容來讀取文件: 'data_1995 = pd.read_excel(open('file_1995.xlsx'),sheetname ='Sheet1')' –

+0

@kfp_ny您爲什麼要這樣做?你需要重新考慮你的程序。 –

+1

@kfp_ny不,你不能,但如果你想保留文件,你可以使用一個字典,並在文件名後面命名鍵值,如果你想創建一個關係。但我建議不要這樣做,並找到一種方法來保持它的動態,如果可以的話,因爲每個文件都將被加載到內存中,否則您將遇到同樣的問題。 – umutto

1

您可以使用os.listdirglob模塊列出目錄中的所有文件。

使用os.listdir,你可以使用fnmatch來過濾這樣的文件(也可以使用正則表達式);

import fnmatch 
import os 

for file in os.listdir('my_directory'): 
    if fnmatch.fnmatch(file, '*.xlsx'): 
     pd.read_excel(open(file, 'rb'), sheetname = 'Sheet1') 
     """ Do your thing to file """ 

或者與水珠模塊(這是對的fnmatch + listdir同時快捷鍵),你可以這樣做這樣的(或用正則表達式):

import glob 
for file in glob.glob("/my_directory/*.xlsx"): 
    pd.read_excel(open(file, 'rb'), sheetname = 'Sheet1') 
    """ Do your thing to file """ 
1

我會建議glob

在做glob.glob('file_*')返回一個列表,你可以迭代和工作。

glob.iglob('file_*')返回一個生成器對象,它是一個迭代器。

第一個會給你這樣的:

['file_1991.xlsx','file_1992.xlsx','file_1995.xlsx','file_1996.xlsx']

0

如果你知道你的文件名可以如何構造,你可能try打開與'r'屬性的文件,這樣open(..., 'r')則會失敗該文件不存在。

yearly_data = {} 

for year in range(1990,2018): 
    try: 
     f = open('file_%4.4d.xlsx'%year, 'r') 
    except FileNotFoundError: 
     continue # to the next year 
    yearly_data[year] = ... 
    f.close()