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

Python CSV读取器返回的行数少于文件中的行数,python,csv,Python,Csv,我正在努力使用csv模块。我有一个示例CSV文件,它有5000行(每行包含7个值0或1)和标题。我想在读取模式下遍历文件,并在写入模式下使用新列值(prediction)追加文件,但迭代会在第478行之后停止(与示例代码中类似): 我已经使用行计数=sum(输入文件中为1)检查了csv\u输入文件的长度,这给了我5000行。您将打开同一文件两次,一次用于读取,一次用于写入 因为在重新打开文件(调用next()之前,您将从文件中获取一些数据,所以它将填充一个读取缓冲区(在Python中,缓冲读取是

我正在努力使用
csv
模块。我有一个示例CSV文件,它有5000行(每行包含7个值0或1)和标题。我想在读取模式下遍历文件,并在写入模式下使用新列值(
prediction
)追加文件,但迭代会在第478行之后停止(与示例代码中类似):

我已经使用
行计数=sum(输入文件中为1)检查了csv\u输入文件的长度,这给了我5000行。

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

因为在重新打开文件(调用
next()
之前,您将从文件中获取一些数据,所以它将填充一个读取缓冲区(在Python中,缓冲读取是默认的)并在该缓冲区上迭代

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

我希望只要您保持在Python的默认缓冲区大小以下(io.default\U buffer\U size,在我的系统上是8kB),代码就可以正常工作

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

打开同一文件两次,一次用于读取,一次用于写入

因为在重新打开文件(调用
next()
之前,您将从文件中获取一些数据,所以它将填充一个读取缓冲区(在Python中,缓冲读取是默认的)并在该缓冲区上迭代

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

我希望只要您保持在Python的默认缓冲区大小以下(io.default\U buffer\U size,在我的系统上是8kB),代码就可以正常工作


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

当您处理小文件且内存不足时,这是一种很好的方法。我的目标是在ML算法学习的同时打开包含数百万行的文件并添加15-20列,并在每次迭代后给出预测输出。当我在算法开始占用csv文件2GB之前为其分配内存时,所以每GB计算;)这是对第二个建议的一个很好的回答,这给了你第一个建议:写一个不同于你正在读的文件。在读取文件之前移动该文件,或者打开一个完全不同的文件进行写入(可能之后再移动)。这就是像sed-i这样的工具所做的。另一种选择是在更具弹性和灵活性的环境中进行存储,例如sqlite db或类似的环境。您是否可以将
写入到不同的文件中,而不是从中读取。在读取文件之前移动该文件,或者打开一个完全不同的文件进行写入(可能之后再移动)作为答案,我会将其标记为完整?这就解决了我的问题。完成后,我将答案的最后一段替换为该段。当您处理小文件且内存不足时,这是一个很好的方法。我的目标是在ML算法学习的同时打开包含数百万行的文件并添加15-20列,并在每次迭代后给出预测输出。当我在算法开始占用csv文件2GB之前为其分配内存时,所以每GB计算;)这是对第二个建议的一个很好的回答,这给了你第一个建议:写一个不同于你正在读的文件。在读取文件之前移动该文件,或者打开一个完全不同的文件进行写入(可能之后再移动)。这就是像sed-i这样的工具所做的。另一种选择是在更具弹性和灵活性的环境中进行存储,例如sqlite db或类似的环境。您是否可以将
写入到不同的文件中,而不是从中读取。在读取文件之前移动该文件,或者打开一个完全不同的文件进行写入(可能之后再移动)作为答案,我会将其标记为完整?这解决了我的问题。完成后,我将答案的最后一段替换为。
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)