【问题标题】:Is there a way to export data from a Counter object to a CSV file?有没有办法将数据从 Counter 对象导出到 CSV 文件?
【发布时间】:2016-02-18 05:17:24
【问题描述】:

我创建了包含字符的 Counter 对象以及这些字符在给定文件中出现的次数。我希望能够以更易读和更有用的格式(例如 CSV)显示这些数据集。

这是一个 Counter 对象示例:

计数器({u'': 10304, u'0': 1630, u'\n': 1516, u'*': 1196, u'.': 1026, u'1':1003,u'A':991,u'E':954,u'9':937,u'S':845,u'R':834, u'T':781,u'O':745,u'2':736,u'F':726,u'4':653,u'N':596, u'C':575,u'3':558,u'L':557,u'5':535,u'I':532,u'8':481, u'7':456,u'6':410,u'P':400,u'\t':388,u'G':377,u'M':327, u'Y':326,u'D':323,u'e':305,u'B':292,u'U':272,u'H':256, u'a':224,u'r':216,u'W':208,u'l':178,u'/':174,u'K':167, u'i':164,u'V':160,u'o':155,u't':155,u'X':153,u'b':134, u'-': 132, u'n': 130, u's': 112, u'$': 97, u'@': 96, u':': 89, u'g': 85,u'c':84,u'Q':75,u'v':75,u'u':71,u'd':69,u'+':68,u'#': 63, u'y': 59, u'h': 58, u'm': 52, u'p': 42, u'Z': 36, u'f': 32, u')': 26, u'(': 26, u'w': 22, u'%': 21, u',': 21, u'!': 17, u'=': 16, u'k': 13, u'J': 12, u'&': 10, u'x': 7, u"'": 6, u'q': 6, u'z': 2})

它类似于字典,但我不知道如何正确提取键、值对,更不用说将它们写入 CSV 文件了。以下代码创建一个 CSV 文件并将计数写入字符列,而根本不将字符写入文件。这是我所得到的。

with open('{}.csv'.format(str(counter_object)), 'w') as csvfile:
    fieldnames = ['character', 'count']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    writer.writeheader()
    for dictionary in counter_object:
        for character, count in dictionary.items():
            writer.writerow(dict(character=count))

是否有任何协议可以专门以这种方式处理 Counter 对象?

编辑

我看到了这个post here,但尝试该解决方案会导致错误:

    for key, count in <counter_object>.items():
AttributeError: 'tuple' object has no attribute 'items'

【问题讨论】:

    标签: python csv data-structures counter


    【解决方案1】:

    问题在于您创建 dict 的方式,请尝试以下方法:

    writer.writerow({'character':character,'count':count})
    #or
    writer.writerow(dict(character=character,count=count))
    

    如果您运行以下代码,现有代码导致问题的原因很明显,您将看到如下内容:

    >>> print(dict(character=count))
    {'character': 4 }
    

    您正在创建一个带有单个键值对的字典,其中键为“字符”,值作为计数。

    编辑:

    你的循环也有问题,而不是两个嵌套的 for 循环,你可以试试这个:

    for character, count in counter_object.items():
    

    【讨论】:

    • 这是给我的:AttributeError: 'unicode' object has no attribute 'items'
    • for character, count in counter_object: ValueError: too many values to unpack
    • 我的 counter_object 被 Python 识别为元组,因此没有 items 属性。
    • 在这种情况下,您的代码现在与您发布的示例不同 - 如果没有看到最新代码,我将无能为力
    • 不,你是对的,由于某种原因,我的计数器对象开始包装在一个元组中,所以我首先使用 for 循环来提取它。不幸的是,我的第一条评论仍然有效:'unicode' object has no attribute 'items' counter 对象看起来与原始帖子中的完全相同,但它的功能不像字典。
    【解决方案2】:

    DictWriter 期望您将每一行作为字典对象传递,其中键与您构造它的 fieldnames 相同。你可以这样做:

    writer.writerows({'character': k, 'count': v} for k, v in counter_object.items())
    

    或者干脆使用普通的 writer 而不是 dictwriter,然后直接传递 items()

    writer = csv.writer(csvfile)
    writer.writerow(fieldnames)   # write header explicitly
    writer.writerows(counter_object.items())  # no transformation needed
    

    请注意,在这两种情况下都不需要 for 循环,只需将列表推导与 writerows() 方法结合使用即可。

    【讨论】:

    • 这是给我的:AttributeError: 'tuple' object has no attribute 'items'
    • 我是否首先需要手动删除字典周围的 Counter(...) 包装器才能使其中任何一个起作用?
    • 不,Counter 仍然是字典,所以它应该可以正常工作。你从哪里得到tuple?如果你还有 for 循环,你应该删除它们..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    相关资源
    最近更新 更多