2013-02-26 95 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'], ...]