2017-02-28 75 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()