我在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行。
答案 0 :(得分:2)
您要打开相同文件两次,一次用于读取,一次用于写入。
因为在重新打开文件之前(next()
),您从文件中获取了一些数据,所以它将填充读取缓冲区(Python中的默认缓冲区是读取缓冲区)并按此顺序进行迭代。
但是,一旦到达读取缓冲区的末尾,它将返回该文件并尝试获取一些数据,这些数据在“ w”模式下重新打开文件已被截断。因此,读取器将不会获得任何数据,并假设它已到达文件末尾(这并非完全错误)并停止。
我希望只要您保持低于Python的默认缓冲区大小(io.DEFAULT_BUFFER_SIZE
,在我的系统上为8kB),代码就可以正常工作。
您应该写入与读取文件不同的文件。在读取文件之前先移动文件,或者打开一个完全不同的文件进行写入(并可能随后移动它)。