从 csv.DictReader 中查找字典值

Posted

技术标签:

【中文标题】从 csv.DictReader 中查找字典值【英文标题】:Find Dict Values from csv.DictReader 【发布时间】:2011-06-30 23:41:43 【问题描述】:

我正在尝试通过 csv.DictReader 获取一个 csv 文件并将其转换为字典。这样做之后,我想修改字典的其中一列,然后将数据写入 tsv 文件。我正在处理文本中的单词和词频。

我尝试使用 dict.value() 函数获取字典值,但我收到一条错误消息,提示“AttributeError: DictReader instance has no attribute "values"”

下面是我的代码:

#calculate frequencies of each word in Jane Austen's "Pride and Prejudice"
import csv

#open file with words and counts for the book, and turn into dictionary
fob = open("P&P.csv", "r")
words = csv.DictReader(fob)
dict = words

#open a file to write the words and frequencies to
fob = open("AustenWords.tsv", "w")

#set total word count
wordcount = 120697

for row in words:
    values = dict.values()
    print values

基本上,我有文本中每个单词的总计数(即“a”,“1937”),我想找到相关单词使用的总单词计数的百分比(因此,对于“a ",百分比将是 1937/120697。)现在我的代码没有执行此操作的等式,但我希望,一旦我获得每一行的值,用单词和计算的百分比。如果有人有更好的方法(或任何方法!)来做到这一点,我将不胜感激。

谢谢

【问题讨论】:

【参考方案1】:

要回答基本问题 - “为什么会出现此错误” - 当您调用 csv.DictReader() 时,返回类型是 iterator 而不是 Dictionary

迭代器中的每一行都是一个Dictionary,然后您可以将其用于您的脚本:

for row in words:    
    values = row.values()    
    print values

【讨论】:

【参考方案2】:

感谢 Matt Dunnam 的回答(我会回复它,但我不知道如何回复)。 csv.DictReader 对象非常违反直觉,不是字典对象(尽管我认为我开始看到为什么不这样做的一些用处)。正如他所说, csv.DictReader 对象是一个迭代器(我对 python 的介绍级别,我认为这可能就像一个列表)。该对象(不是字典)中的每个条目都是字典。

因此,csv.DictReader 返回类似于字典列表的内容,这与返回一个字典对象不同,尽管有名称。

到目前为止,很好的是 csv.DictReader 确实在第一行保留了我的键值,并将它们正确地放置在作为它实际返回的可迭代对象一部分的许多字典对象中的每一个中(再次,它不返回字典对象!)。

我在这个问题上浪费了大约一个小时,文档还不够清楚,尽管现在我了解了 csv.DictReader 返回的对象类型,文档更加清晰。我认为文档说它如何返回一个可迭代对象,但如果你认为它返回一个字典并且你不知道字典是否是可迭代的,那么这很容易理解为“返回一个字典对象”。

文档应该说“这不返回字典对象,而是返回一个包含每个条目的字典对象的可迭代对象”或类似的东西。作为一个 20 年没有编码的 Python 新手,我一直遇到问题,文档是由专家编写并为专家编写的,对于初学者来说太密集了。

我很高兴它的存在并且人们花时间在它上面,但是对于初学者来说它可以变得更容易,同时又不会降低它对 Python 专家的价值。

【讨论】:

感谢您将这一点说清楚,就像马特在上面所做的那样,但更重要的是。

以上是关于从 csv.DictReader 中查找字典值的主要内容,如果未能解决你的问题,请参考以下文章

将 csv.DictReader 对象转换为字典列表?

Python解析CSV中的多维字典

将 CSV 的前 n 行读入字典

如何读取 2 列 csv 文件并创建字典?

Python Dictreader 对字段名进行排序

如何仅用 reduce 和 map 每年总结一本字典?