【问题标题】:Why they use collections in writing csv?) Puzzles me为什么他们在编写 csv 时使用集合?)让我困惑
【发布时间】:2025-12-01 03:10:01
【问题描述】:

偶然发现这个话题Save results to csv file with Python

我只需要 - 将 csv 更改写入文件。但。这段代码偷了我的一些行))不合理的数量(而不是代码中的五个)

您能解释一下为什么他们在这个简单的操作中使用集合吗? 为什么在这里使用计数器?

Use csv.writer:

import csv

with open('thefile.csv', 'rb') as f:
  data = list(csv.reader(f))

import collections
counter = collections.defaultdict(int)
for row in data:
    counter[row[0]] += 1


writer = csv.writer(open("/path/to/my/csv/file", 'w'))
for row in data:
    if counter[row[0]] >= 4:
        writer.writerow(row)

【问题讨论】:

    标签: python csv


    【解决方案1】:

    这一行

    counter = collections.defaultdict(int)
    

    创建一个defaultdict,其中值是整数,默认值为零。然后这个位

    for row in data:
        counter[row[0]] += 1
    

    扫描输入,并计算第一个字段中的值在文件中出现的次数。最后,代码仅输出第一个值至少出现 4 次的那些行。改用collections.Counter 可以缩短这一切,但我不知道十年前是否在标准库中。

    【讨论】:

    • 我要指出,用于读取和写入 CSV 文件的库可以很好地处理各种 CSV 方言。这就是我在我编写的任何代码中使用它们的原因。 (我的filterCSVmdpre repos 都是这样做的。)是的,当然你可以手动编写CSV,但何必呢? (对于阅读,您对格式的控制较少,所以我什至不会尝试。)
    • 非常感谢您的澄清,但为什么您可能需要“至少 4 次”这个东西?
    • 程序就是这样做的。为什么它的作者想要它这样做是不可能知道的。值得注意的是,据我所知,这与您链接到的帖子中的实际问题完全无关。这个问题的提问者没有很好地提出一个最小的例子。
    • 知道了。非常感谢您的解释!在这里提问是一次很棒的经历,所以我已经做了另一个))很高兴我注册了。
    【解决方案2】:

    不确定原始代码中发生了什么,但我认为它会读取输入并创建数据行字典并为每一行分配一个计数器。因此,如果有两条相同的数据线顺便说一句,这将无法正常工作。然后它使用这个字典来确定前 4 行,以便在写入输出时跳过它们(这不是字典的好用法恕我直言)。

    if counter[row[0]] >= 4:
    

    主要是这是 11 年前的旧答案。那时用于处理 csv 文件的 Python 库(如 pandas)并不常用。现在做这样的事情更容易了。

    import pandas as pd
    
    # semicolon separated and comma decimals, skip first 4 rows
    df_in = pd.read_csv("oldfile.csv", delimiter=";", decimal=",", skiprows=(0,1,2,3))
    
    # comma separated and point decimals
    df_in.to_csv("newfile.csv", sep=",", decimal=".")
    

    【讨论】:

    • 我的 Python 之旅才刚刚开始。我应该立即学习熊猫还是坚持使用 csv 模块?刚刚用 csv 完成了我的代码
    • @BogdanMind 您是一般编程新手,还是只是 Python 新手?如果您是一般的编程新手,我建议您暂时坚持简单的东西。 Pandas 非常强大,但也相当庞大和复杂,有时需要以不同于“直接” Python 编程的方式思考。但我相信你会发现对此有不同的看法。 :)
    • 非常感谢您的友好和支持回答!是的,我一般是编程新手)
    最近更新 更多