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

时间:2018-02-02 21:44:12

标签: python pandas

我有一份日期清单。

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:
        ?????

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

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

{{1}}

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

2 个答案:

答案 0 :(得分:2)

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

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

  

file0.csv
  file2.csv
  file3.csv
  file5.csv
  file8.csv
  file9.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,]

答案 1 :(得分:0)

调用您的函数为每个可能的文件返回一些内容。由于您想要跳过某些内容,请将迭代逻辑移动到您的函数中,然后通过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)))