将文件读入字典

时间:2013-02-26 21:42:07

标签: python file-upload dictionary delimiter

我想知道是否有一种方法可以将分隔文本读入字典。我已经能够将它列入列表这里没有问题代码:

def _demo_fileopenbox():        
    msg  = "Pick A File!"
    msg2 = "Select a country to learn more about!"
    title = "Open files"
    default="*.py"
    f = fileopenbox(msg,title,default=default)
    writeln("You chose to open file: %s" % f)
    c = []
    a = []
    p = []

    with open(f,'r') as handle:
        reader = csv.reader(handle, delimiter = '\t')  
        for row in reader:
            c = c + [row[0]]
            a = a + [row[1]]
            p = p + [row[2]]
        while 1:
            reply = choicebox(msg=msg2, choices= c )
            writeln( reply + ";\tArea: " + a[(c.index(reply))] + " square miles \tPopulation: " + p[(c.index(reply))] )

该代码使其成为3个列表,因为每行文本都是国家/地区名称,区域和人口。我就是这样,所以如果我选择一个国家,它会给我关于流行和地区的相关信息。有人说字典是一种更好的方法,但首先我不认为我可以将三个东西放入字典中的一个位置。我需要国家/地区名称作为密钥,然后是人口和区域该密钥的信息。 2个字典可能有用吗?但我只是不知道如何从文件到字典,任何帮助PLZ?

4 个答案:

答案 0 :(得分:2)

你可以使用两个词典,但你也可以使用这样的2元组:

countries = {}

# ... other code as before

    for row in reader:
        countries[row[0]] = (row[1], row[2])

然后你可以像这样迭代它:

for country, (area, population) in countries.iteritems():
    # ... Do stuff with country, area and population

...或者您可以访问特定国家/地区的数据:

area, population = countries["USA"]

最后,如果您计划在将来添加更多信息,您可能希望使用类作为更优雅的方式来保存信息 - 这样可以更轻松地编写不具备此功能的代码添加新内容时中断。你有这样的课程:

class Country(object):

    def __init__(self, name, area, population):
        self.name = name
        self.area = area
        self.population = population

然后你的阅读代码看起来像这样:

for row in reader:
    countries[row[0]] = Country(row[0], row[1], row[2])

或者如果你有构造函数占用整行而不是单个项,你可能会发现以后更容易扩展格式,但是你还要将类更紧密地耦合到文件中的表示。这取决于您认为以后可能会延伸的方式。

然后你可以这样看:

country = countries["USA"]
print "Area is: %s" % (country.area,)

这样做的好处是,您可以添加新方法,以便将来做更聪明的事情。例如,一种返回人口密度的方法:

class Country(object):

# ...

    def get_density(self):
        return self.population / self.area

一般情况下,如果超出了存储多个项目的范围,我会推荐类似嵌套词典的课程。它们使您的代码更易于阅读,并且以后更容易扩展。

与大多数编程问题一样,其他方法也可行 - 这是选择最适合您的方法的一种情况。

答案 1 :(得分:1)

这样的事情应该有效:

from collections import defaultdict

myDict = {}
for row in reader:
    country, area, population = row
    myDict[country] = {'area': area, 'population': population}

请注意,您必须添加一些错误检查,以便在每行中有大于或少于三个分隔的项目时,代码不会中断。

您可以按如下方式访问值:

>>> myDict['Mordor']['area']
175000
>>> myDict['Mordor']['population']
3000000

答案 2 :(得分:0)

字典的值可以是人口和区域信息的元组。因此,当您在文件中阅读时,您可以执行诸如

之类的操作
countries_dict = {}

for row in reader:
        countries_dict[row[0]] = (row[1],row[2])

答案 3 :(得分:0)

data = []

with open(f,'r') as handle:
    reader = csv.reader(handle, delimiter = '\t')  
    for row in reader:
        (country, area, population) = row
        data.append({'country': country, 'area': area, 'population': population})

数据将是词典列表

但我不确定这是一个更好的方法,因为它会使用更多的内存。另一种选择只是列表清单:

data = list(csv.reader(open(f), delimiter='\t'))
print data
# [['USA', 'big', '300 million'], ...]