有没有办法将数据从 Counter 对象导出到 CSV 文件?
Is there a way to export data from a Counter object to a CSV file?
我创建了包含字符和这些字符在给定文件中出现的次数的计数器对象。我希望能够以更具可读性和实用性的格式显示这些数据集,例如 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'
问题出在你创建字典的方式上,试试这样的方法:
writer.writerow({'character':character,'count':count})
#or
writer.writerow(dict(character=character,count=count))
如果您 运行 以下代码,您现有代码导致问题的原因很明显,您会看到类似这样的内容:
>>> print(dict(character=count))
{'character': 4 }
您正在创建一个包含单个键值对的字典,其中键为 'character',值为计数。
编辑:
你的循环也有问题,而不是两个嵌套的 for
循环,你可以试试这个:
for character, count in counter_object.items():
A 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
请注意,在任何一种情况下都不需要循环,您可以将列表理解与 writerows()
方法结合使用。
我创建了包含字符和这些字符在给定文件中出现的次数的计数器对象。我希望能够以更具可读性和实用性的格式显示这些数据集,例如 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'
问题出在你创建字典的方式上,试试这样的方法:
writer.writerow({'character':character,'count':count})
#or
writer.writerow(dict(character=character,count=count))
如果您 运行 以下代码,您现有代码导致问题的原因很明显,您会看到类似这样的内容:
>>> print(dict(character=count))
{'character': 4 }
您正在创建一个包含单个键值对的字典,其中键为 'character',值为计数。
编辑:
你的循环也有问题,而不是两个嵌套的 for
循环,你可以试试这个:
for character, count in counter_object.items():
A 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
请注意,在任何一种情况下都不需要循环,您可以将列表理解与 writerows()
方法结合使用。