将.csv文件读入Python列表

时间:2011-11-04 01:04:17

标签: python csv

我在目录中有很多.csv文件,我想在Python中的循环中打开它们,这样第一个.csv被读入list [0]而第二个.csv被读入列表[1]等等。

不幸的是,当我的代码循环遍历所有.csv文件时,它会将所有.csv文件放入list [0]。如何修改我的代码以便我可以实现上述目标?非常感谢。

约翰

以下是代码:

def create_data_lists():
i=0
for symbol in symbols:
    with open(symbols[i]+'.csv', 'r') as f:
        print i
        reader = csv.reader(f)
        reader.next()
        for row in reader:
            rowdata.append(row)
    data_by_symbol.append(rowdata)
    i=i+1

2 个答案:

答案 0 :(得分:10)

在for循环内,靠近顶部,你必须刷新列表rowdata。否则你将永远添加到那个。在rowdata = []

之后立即使用print i
def create_data_lists():

    for symbol in symbols:
        with open(symbol+'.csv', 'r') as f:
        print symbol
        rowdata = []
        reader = csv.reader(f)
        reader.next()
        for row in reader:
            rowdata.append(row)
    data_by_symbol.append(rowdata)

编辑摆脱了i,因为我真的没有使用它

答案 1 :(得分:5)

为什么不将读者自己存储在列表中?

list_of_csv_files = []

for f in filenames:
    list_of_csv_files.append(csv.DictReader(open(f)))

这会将阅读器本身存储在一个列表中,以便您稍后执行以下操作:

for row in list_of_csv_files[0]:
    # do some processing on the row

这种方法的最大优点是,您可以使用以下方法轻松完成过滤列之类的操作:

one_row = [row["name of column heading"] for row in list_of_csv_files[0]]
two_rows = [[row["name col 2"], row["name col 2"]] for row in list_of_csv_files[0]]

我怀疑这对你的程序比存储预读(和解析结构的)csv文件更有帮助。

但是如果你真的想要读入并存储在列表中的所有CSV文件,你需要一个列表列表,我不推荐这个,它将是非常耗费内存的:

list_of_csv_files = [[]]

for f in filenames:
    list_of_csv_files.append([row.values() for row in csv.DictReader(open(f))])