【问题标题】:csv reader errors when modifying the original file pointer修改原始文件指针时出现 csv 阅读器错误
【发布时间】:2014-08-23 06:04:30
【问题描述】:

在使用 csv 模块读取 csv 文件时,我发现了一个让我感到困惑的问题。如果在创建阅读器对象和打印它的行之间我用文件指针做某事, print(row) 什么也不打印,如果我注释掉循环文件,那么行将按预期打印,即 csv 中的数据文件

显然访问文件 ptr 会对 reader 对象产生副作用,但我不明白为什么会这样?

在调用 csv.reader() 之后,读取器对象中的数据是否应该不独立于从中读取的文件?

import csv

num_lines = 0

with open("test.csv", 'r') as f:
    reader = csv.reader(f)

    for line in f:
        num_lines += 1

    for row in reader:
        print(row)

【问题讨论】:

    标签: python csv


    【解决方案1】:

    是的,csv.reader() 对象依赖于维护文件中位置的基础文件对象。您必须“倒带”文件:

    for line in f:
        num_lines += 1
    
    f.seek(0)
    
    for row in reader:
        print(row)
    

    【讨论】:

    • 啊好吧 - 这是一个标准的东西,它肯定违反了我的“最小惊喜原则”,但也许它不应该有?
    • @bph:你期望它的表现如何?你给了阅读器一个文件来读取,但是那个文件对象并不关心读取谁;如果您直接阅读,则指针前进相同。 csv.reader() 对象不会也不应该关心文件对象接下来要读取的位置。
    • 我假设读取器对象会在文件中创建数据的单独副本,并且从调用 csv.reader() 的点来看,读取器对象将独立于包含数据的文件- 也许那是低效的?
    猜你喜欢
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 2011-12-19
    • 2015-08-10
    相关资源
    最近更新 更多