从csv.DictReader中查找Dict值

时间:2011-02-21 01:05:24

标签: csv dictionary

我正在尝试通过csv.DictReader获取csv文件并将其转换为字典。执行此操作后,我想修改字典的其中一列,然后将数据写入tsv文件。我正在处理文字中的单词和单词频率。

我尝试使用dict.value()函数来获取字典值,但是我收到一条错误消息,说“AttributeError:DictReader实例没有属性”值“”

以下是我的代码:

#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。)现在我的代码没有这样做的等式,但是我希望,一旦我获得每行的值,就用新的文件写一行单词和计算的百分比。如果有人有更好的方式(或任何方式!)这样做,我将非常感谢任何输入。

由于

2 个答案:

答案 0 :(得分:13)

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

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

到目前为止,有什么好处是csv.DictReader确实在第一行保留了我的键值,并将它们正确地放在许多字典对象中,这些对象是它实际返回的可迭代对象的一部分(同样,它不会返回字典对象!)。

我浪费了大约一个小时的时间来敲打这个,文档不够清晰,虽然现在我明白了csv.DictReader返回什么类型的对象,文档更加清晰。我认为文档说的是它如何返回一个可迭代对象,但如果你认为它返回一个字典并且你不知道字典是否可迭代,那么这很容易阅读,因为"返回一个字典对象"

文档应该说"这不会返回字典对象,而是返回一个包含每个条目的字典对象的可迭代对象"或某些这样的事情。作为一个在20年内没有编码的蟒蛇新手,我一直遇到文档由专家编写的问题,而且对于初学者来说它太密集了。

我很高兴它在那里,人们已经把时间花在了它上面,但是对于初学者来说可以更容易,而不是减少它对专业pythonistas的价值。

答案 1 :(得分:12)

要回答基本问题 - “为什么我收到此错误” - 当您致电csv.DictReader()时,返回类型为iterator而不是Dictionary

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

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