Python:如何重新启动FOR循环,迭代csv

时间:2016-09-15 14:22:20

标签: python loops csv for-loop restart

我正在使用Python 3.5,我想将数据从csv加载到几个列表中,但它只能在FOR-Loop中使用一次。然后它加载0。

以下是代码:

f1 = open("csvfile.csv", encoding="latin-1")
csv_f1 = csv.reader(f1, delimiter=';')

list_f1_vorname = []
for row_f1 in csv_f1:
    list_f1_vorname.append(row_f1[2])

list_f1_name = []
for row_f1 in csv_f1:   # <-- HERE IS THE ERROR, IT DOESNT WORK A SECOND TIME!
    list_f1_name.append(row_f1[3])    

有人知道如何重启这件事吗? 致以真诚的感谢和诚挚的问候, Saitam

4 个答案:

答案 0 :(得分:4)

csv_f1不是list,而是迭代。

您可以使用csv_f1list()缓存到列表中,也可以只重新创建对象。

我建议重新创建对象,以防你的cvs数据变得非常大。这样,数据就不会完全放入RAM中。

答案 1 :(得分:2)

简单的答案是迭代csv一次并将其存储到列表中。

之类的东西
my_list = []
for row in csv_f1:
    my_list.append(row)

或abukaj用

写的内容
csv_f1 = list(csv.reader(f1, delimiter=';'))

然后继续并根据需要多次迭代该列表。

但是,如果您只想获得某些列,那么您可以在同一个for循环中执行此操作。

list_f1_vorname = []
list_f1_name = []
for row in csv_f1:
    list_f1_vorname.append(row[2])
    list_f1_name.append(row[3])

它不能多次工作的原因是因为它是一个迭代器...所以它会迭代一次值,但是在迭代完数据之后不再重新开始。

答案 2 :(得分:1)

尝试:

csv_f1 = list(csv.reader(f1, delimiter=';'))

它并没有完全重新启动阅读器,而是将文件内容缓存在列表中,这可能会多次迭代。

答案 3 :(得分:1)

到目前为止,没有人注意到的一件事是你试图将名字和姓氏存储在两个单独的列表中。以后使用这不会很方便。因此,尽管其他答案显示了将csv中的姓名和姓氏读入两个单独列表的正确可能解决方案,但我建议您使用单个词典列表:

f1 = open("csvfile.csv", encoding="latin-1")
csv_f1 = csv.reader(f1, delimiter=";")

list_of_names = []
for row_f1 in csv_f1:
    list_of_names.append({
       "vorname": row_f1[2],
       "name": row_f1[3]
    })

然后,您可以遍历此列表并获取所需的值。例如,只需打印值:

for row in list_of_names:
    print(row["vorname"])
    print(row["name"])

最后但并非最不重要的是,你可以通过使用列表理解来构建这个列表(有点像Pythonic):

list_of_names = [
   {
       "vorname": row_f1[2],
       "name": row_f1[3]
   }
   for row_f1 in csv_f1
]

正如我所说,我很欣赏其他答案。它们解决了csv阅读器可迭代的问题,而不是类似列表的对象 不过我在你的问题中看到了一点XY问题。我已经多次尝试在多个列表中存储实体属性(名称和姓氏显然是相关属性并形成一个简单的实体)。它总是以难以阅读和维护的代码结束。