我是python的新手,不知道为什么会出现这种错误。

我有一个csv文件,我从中读取一些数据。我将这些数据与另一个csv文件进行比较,如果我发现有相似之处,我想从第二个文件中复制一些数据。然而,问题是这样的。

            with open('WeselVorlageRE5Woche.csv') as woche:
                with open('weselfund.csv','+a',newline='') as fund:
                    readCSV1 = csv.reader(woche, delimiter=';')
                    for row1 in readCSV1:   
                        if row[1]==row1[4]: #find starting time
                            if row[3]==row1[1]: # find same train
                                if row[2]=='cancelled': # condition for taking row
                                    zug=row1[6]     #copy trainnumber
                                    print(zug)
                                    for row2 in readCSV1:
                                        if row2[6]==zug: #find all trainnumbers
                                            #write data to csv
                                            writer = csv.writer(fund, delimiter=';')
                                            writer.writerow(row2)

在我的第二个for循环中,似乎第一行被跳过。每次for循环开始时,第一行数据并没有写入新文件。 我读取的数据集 写的数据集 谁能告诉我为什么第一个总是缺失? 如果我在我读取的数据集中添加一个假人行,我得到的正是我想要写的东西,但我不想添加所有的假人。

python
for-loop
export-to-csv
ferox666
ferox666
发布于 2020-06-01
1 个回答
Hephaistos-plus
Hephaistos-plus
发布于 2020-06-01
已采纳
0 人赞同

如果你在csv上进行迭代,csv阅读器会被 "用完"。这就是为什么第二个循环没有看到第一行,因为第一个循环已经 "用完 "了。我们可以通过在一个术语列表上做一个简单的读取器来说明这一点。

>>> import csv
>>> test = ["foo", "bar", "baz"]
>>> reader = csv.reader(test)
>>> for row in reader:
...     print(row)
['foo']
['bar']
['baz']
>>> for row in reader:
...     print(row)

第二次它什么都不打印,因为迭代器已经用完了。如果你的数据集不是太大,你可以通过将行存储在一个列表中来解决这个问题,从而将其存储在内存中。

data = [row for row in readCSV1]

如果文件太大,你将需要制作第二个文件阅读器,并将其送入第二个csv阅读器。

最后的代码变成了。

with open('WeselVorlageRE5Woche.csv') as woche:
    with open('weselfund.csv','+a',newline='') as fund:
        readCSV1 = [row for row in csv.reader(woche, delimiter=';')]
        for row1 in readCSV1:   
            if row[1]==row1[4]: #find starting time
                if row[3]==row1[1]: # find same train
                    if row[2]=='cancelled': # condition for taking row
                        zug=row1[6]     #copy trainnumber
                        print(zug)
                        for row2 in readCSV1:
                            if row2[6]==zug: #find all trainnumbers
                                #write data to csv
                                writer = csv.writer(fund, delimiter=';')
                                writer.writerow(row2)

与解决方案,将其存储在内存中。如果你想用第二个读卡器来代替,就变成了

with open('WeselVorlageRE5Woche.csv') as woche:
    with open('weselfund.csv','+a',newline='') as fund:
        readCSV1 = [row for row in csv.reader(woche, delimiter=';')]
        for row1 in readCSV1:   
            if row[1]==row1[4]: #find starting time
                if row[3]==row1[1]: # find same train
                    if row[2]=='cancelled': # condition for taking row
                        zug=row1[6]     #copy trainnumber
                        print(zug)
                        with open('WeselVorlageRE5Woche.csv') as woche2:
                            readCSV2 = csv.reader(woche2, delimiter=';')
                            for row2 in readCSV2: