2013-02-26 102 views
1

我想知道是否有方法可以将分隔文本读入字典。我已经能够在这里获得进入名单没有问题是代码:将文件读入字典

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?

回答

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 

一般来说,我会建议过类似的嵌套字典类,一旦你超越的东西,你要存储超过两件以上。它们使您的代码更易于阅读,并且更容易在以后扩展。

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

+0

这就是我在结果之前我甚至看到了这个!谢谢! – erp 2013-02-26 22:38:44

0

字典的值可以是人口和区域信息的元组。所以,当你在文件中读取,你可以做一些事情,如

countries_dict = {} 

for row in reader: 
     countries_dict[row[0]] = (row[1],row[2]) 
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 
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'], ...]