我在目录中有很多.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
答案 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))])