【问题标题】:Why does counting lines of csvfile in Python's csv.DictReader break my code?为什么在 Python csv.DictReader 中计算 csv 文件的行数会破坏我的代码?
【发布时间】:2019-07-30 11:56:17
【问题描述】:

这感觉像是一个愚蠢的错误,但我无法发现它。当我执行这段代码时:

with open('test.csv') as csvfile:
    # row_count = sum(1 for row in csvfile)
    reader = csv.DictReader(csvfile, delimiter = ';')
    path = os.getcwd()      # ← gets current directory

    for row in reader:
        header = row['FirstName'] + ' ' + row['Surname'] + ' – #' + row['RecruitmentID'].zfill(5)
        print('Processing: ' + ' / ' + header)

我得到的是:

Processing:  / AAA aaa – #00005
Processing:  / BBB bbb – #00008
Processing:  / CCC ccc – #00160
[Finished in 0.3s]

但是当我取消注释 # row_count = sum(1 for row in csvfile) 时,我只会在控制台中得到 [Finished in 0.3s]

即使使用另一种方法:numberofrows = len(list(reader)) 也会以同样的方式破坏它。我做错了什么?

【问题讨论】:

  • 在执行 row_count = sum(1 for row in csvfile) 时,您会转到文件的末尾,这样 csv 阅读器不会做其他任何事情,请尝试执行 csvfile.seek(0),这应该会让您回到文件的开头文件,在创建 csv 阅读器之前
  • @LohmarASHAR 哦,就是这样!谢谢,我是处理流和文件的新手……
  • 离题:当您提出问题并编写一些示例代码时,请尽量减少。导入pypdftkpath = os.getcwd() 会使其他用户阅读过多与您的问题无关的代码(并考虑一下)。谢谢。
  • @eumiro 也许你是对的,但我并不是完全不知道是哪一部分导致了这种行为。为清楚起见,编辑器。

标签: python python-3.x csv dictionary


【解决方案1】:

以下将读取整个 CSV 文件:

row_count = sum(1 for row in csvfile)

当您使用 Python(或任何其他语言)读取文件时,您正在移动文件中的“位置”。当您读完文件时,该位置被记住为文件的结尾。没有什么可读的了。

您可以关闭并重新打开文件,也可以“倒回”/“寻找”位置回到文件的开头。

这是通过以下代码完成的:

csvfile.seek(0, os.SEEK_SET)

【讨论】:

  • 感谢您向我解释这一点。就我的程序行为而言,我看不出csvfile.seek(0, os.SEEK_SET) 与 csvfile.seek(0) 有何不同。
  • 你说得对,它们是一回事。来自official documentation about file I/O:“要更改文件对象的位置,请使用f.seek(offset, from_what).from_what 是可选的,但具有值 0(“从文件开头”)、1(“从当前位置”)和2(“从文件末尾开始”)。只需将 csvfile.seek(0) 默认为 0。os.SEEK_SET == 0 也是如此。
【解决方案2】:

row_count = sum(1 for row in csvfile) 将读取整个文件。致电 for row in reader: 时,您已经在 EOF。

【讨论】:

    猜你喜欢
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 2011-03-25
    相关资源
    最近更新 更多