Python CSV阅读器返回的行少于文件中的行

时间:2019-04-24 07:13:20

标签: python csv

我在csv模块中苦苦挣扎。我有一个示例CSV文件,该文件包含5000行(每行包含7个值0或1)和标题。我想在读取模式下遍历文件,并在写入模式下使用新的列值(prediction附加文件,但是迭代在第​​478行之后停止(如示例代码中所示):

import csv
import random


def input_to_csv():

    prediction = [round(random.uniform(0, 1), 0) for _ in range(1, 5000)]

    combined_set = list(map(str, prediction))

    export_columns = ['COLUMN ' + str(n) for n in range(1, 8)] + ['OUTPUT'] 

    rr = 0
    with open('test.csv', 'r') as input_file:

        csv_input = csv.reader(input_file)
        next(csv_input)

        with open('test.csv', 'w', newline='') as csv_file:

            writer = csv.writer(csv_file)
            writer.writerow(export_columns)

            for row in csv_input:

                rr += 1

        print(rr)

我已经使用row_count = sum(1 for _ in input_file)检查了csv_input文件的长度,这给了我5000行。

1 个答案:

答案 0 :(得分:2)

您要打开相同文件两次,一次用于读取,一次用于写入。

因为在重新打开文件之前(next()),您从文件中获取了一些数据,所以它将填充读取缓冲区(Python中的默认缓冲区是读取缓冲区)并按此顺序进行迭代。

但是,一旦到达读取缓冲区的末尾,它将返回该文件并尝试获取一些数据,这些数据在“ w”模式下重新打开文件已被截断。因此,读取器将不会获得任何数据,并假设它已到达文件末尾(这并非完全错误)并停止。

我希望只要您保持低于Python的默认缓冲区大小(io.DEFAULT_BUFFER_SIZE,在我的系统上为8kB),代码就可以正常工作。

您应该写入与读取文件不同的文件。在读取文件之前先移动文件,或者打开一个完全不同的文件进行写入(并可能随后移动它)。