我有一个日期列表。
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)))