如果pandas.read_csv在循环中遇到空文件怎么办



我有一个日期列表。

dates = [20170203, 20170204 ...]

我通常做的是:

output = pd.concat([pd.read_csv('filename_{0}.csv'.format(x)) for x in dates])

但是,当文件不存在时,该行不起作用。

所以我创建了一个包装函数:

output = pd.concat([reader('filename_{0}.csv'.format(x)) for x in dates])
def reader(x):
    if os.path.isfile(x):
        return pd.read_csv(x)
    else:
        ?????

问题来了:如果我不知道文件的标头是什么,我应该把什么作为返回值?

output = pd.concat([pd.read_csv('filename_{0}.csv'.format(x)) for x in dates if os.path.isfile('filename_{0}.csv'.format(x))])

跳过将无效文件传递到pd.concat

假设文件夹中存在以下文件:

文件0.csv
文件2.csv
文件3.csv
文件5.csv
文件8.csv
文件9.csv

dates = list(range(10))
results = ['file{0}.csv'.format(x) for x in dates if os.path.isfile('file{0}.csv'.format(x))]
# results:
#
# [file0.csv,
#  file2.csv,
#  file3.csv, 
#  file5.csv, 
#  file8.csv, 
#  file9.csv,]

调用您的函数以为每个可能的文件返回一些内容。由于你想跳过一些,所以将迭代逻辑移动到你的函数中,并通过yielding名称将其转换为生成器:

def reader(files_iterator):
    for filename in files_iterator:
        if os.path.isfile(filename):
            yield pd.read_csv(x)

像这样使用它:

output = pd.concat(list(reader('filename_{}.csv'.format(x) for x in dates)))

最新更新