2013-02-26 3 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리스트를 만든다 : 여기 목록으로 아무 문제가 그것을 얻을 수 있었다 코드입니다. 그런 식으로 생각합니다. 그래서 나라를 선택하면 팝과 지역에 대한 부식적인 정보를 줄 것입니다. 어떤 사람들은 사전이 더 나은 접근법이라고 말하지만, 무엇보다 먼저 사전에 int를 세 개 넣을 수 있다고 생각하지 않습니다. 국가 이름을 키로 입력하고 인구를 입력하고 해당 키의 정보를 입력해야합니다. 아마 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

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'], ...]