2013-02-14 6 views
1

사전에 제목이있는 2 열 (color number_of_occurances) .tsv 파일을 분석하려고합니다. 가능하면 가장 일반적인 방법으로 제목 줄을 건너 뛰려고합니다 (두 번째 열을 int 유형으로 지정해야한다고 가정). 다음은 내가 가지고 올 것 중에 최고,하지만 더 나은이 있어야한다 보인다 :Python : 다른 유형의 변수를 사용하여 파일에서 행 읽기

filelist = [] 
color_dict = {} 
with open('file1.tsv') as F: 
    filelist = [line.strip('\n').split('\t') for line in F] 
for item in filelist: 
    try: #attempt to add values to existing dictionary entry 
     x = color_dict[item[0]] 
     x += int(item[1]) 
     color_dict[item[0]] = x 
    except: #if color has not been observed yet (KeyError), or if non-convertable string(ValueError) create new entry 
     try: 
      color_dict[item[0]] = int(item[1]) 
     except(ValueError): #if item[1] can't convert to int 
      pass 

가 할려고하고 예외를 처리하는 더 좋은 방법이 있어야처럼 보인다. 요청에 의해

파일 발췌 :

color Observed
green 15
gold 20
green 35

+0

입력 파일의 샘플을보고 도움이 될 것입니다 ... 당신이 사용하고 왜 – thebjorn

+0

'항목 [2]'대신'항목 [1]'의? 탭에서 탭으로 구분 된 행을 분할하면 2 개의 요소 목록 만 제공하게됩니다. –

+0

헤더는 항상 한 줄입니까? 그렇다면 목록 작성 전에 'next (F)'를 입력하십시오. (물론 목록 작성이 모두 필요하다고 확신하지는 않습니다. 왜냐하면 당신이하는 일은 목록 전체에서 반복되는 것 같습니다.) –

답변

4

당신은 그냥이 같은 [1:]으로 목록을 슬라이스하여 목록의 첫 번째 요소를 생략 할 수 없습니다

filelist = [line.strip('\n').split('\t') for line in F][1:] 

이제 fileList에는 첫 번째 줄, 즉 제목 줄의 요소가 전혀 포함되지 않습니다.

또는 @StevenRumbalski에 의해 코멘트에서 지적했듯이, 당신은 단순히이 같은 첫 번째 요소 후, 목록의 사본을 피하기 위해 지능형리스트 전에 next(F, None)을 수행 할 수 있습니다

with open('file1.tsv') as F: 
    next(F, None) 
    filelist = [line.strip('\n').split('\t') for line in F] 

또한 defaultdict을 사용하면 더 좋을 것입니다. 이 같은

사용을 :

from collections import defaultdict 
color_dict = defaultdict(int) 

그리고 이러한 방법으로, 당신은 그것을 사용하기 전에, key의 존재를 확인 할 필요가 없습니다. 따라서 간단히 다음을 수행 할 수 있습니다.

color_dict[item[0]] += int(item[1]) 
+2

'next (F)'는 특히 소스 파일이 큰 경우 슬라이스를 통해 목록의 다른 복사본을 만드는 것보다 낫습니다. –

+0

다음을 의미합니다 :'line.strip ('\ n'). split ('\ t') for line in next (F)]'? –

+0

번호 목록 이해하기 전의 줄. 이터레이터는 파일의 두 번째 줄로 진행한다. –

2

이 경우 defaultdict을 사용합니다. 왜냐하면 각 키가 처음으로 발견되었을 때, 그것은 이미 매핑에 있지 않기 때문에; 그래서 항목이 자동으로 작성됩니다.

from collections import defaultdict 
color_dict = defaultdict(int) 
for item in filelist: 
     color_dict[item[0]] += int(item[1]) 
+0

'defaultdict', 아주 잘 몰랐어요! – Bolo

+0

'(int) item [2]'는'int (item [2])'로 편집되어야합니다. (그리고 인덱스가 부정확 할 수 있으므로 '1'로 변경하십시오.) –

+0

@StevenRumbalski, 업데이트 주셔서 감사합니다! – ogzd