2011-11-04 8 views
9

디렉토리에 많은 .csv 파일이 있고 파이썬 내에서 각각의 .csv 파일을 목록 [0]과 두 번째 .csv는 list [1]에 읽혀집니다..csv 파일을 파이썬 목록으로 읽기

불행히도 내 코드가 모든 .csv 파일을 반복하는 동안 모든 .csv 파일을 list [0]에 저장합니다. 위의 목표를 달성 할 수 있도록 코드를 수정하려면 어떻게해야합니까? 많은 감사합니다. 상단에, 당신은 목록 rowdata을 새로 고쳐야 할, 루프 내부

def create_data_lists(): 
i=0 
for symbol in symbols: 
    with open(symbols[i]+'.csv', 'r') as f: 
     print i 
     reader = csv.reader(f) 
     reader.next() 
     for row in reader: 
      rowdata.append(row) 
    data_by_symbol.append(rowdata) 
    i=i+1 
+0

'for ... in'을 사용할 때 색인 생성을 사용할 필요가 없으므로'open (symbols [i] ...)'를'open (symbol ...)'으로 대체하고 get 모든 것을 없애라. – tjm

답변

11

:

여기에 코드입니다. 그렇지 않으면 당신은 그 것을 영원히 추가하고 있습니다. 난 정말 왜 목록에 독자 스스로를 저장하지 그것을

+0

rowdata = []을 (를) 추가하면 트릭이 완료됩니다. 감사! 그러나 인덱싱을 제거하면 다음과 같은 오류가 발생합니다. "create_data_lists 에서 f ()로 열린 (기호 + '. csv', 'rb') 열이 35 번째 줄 TypeError : 목록 ("str "이 아님) 만 연결할 수 있습니다. " – johnjdc

+0

@ johnjdc :'symbol'과'symbols'의 차이점을 주목하십시오. 'for symbol in symbols :'구조체를 사용하면리스트 심볼의 각 요소를 하나씩 가져 와서 프로그램에서'i'를 가질 필요가 없습니다. 일단 표현에 익숙해지면 코드를 정리할뿐입니다. tjm이 지적한 것처럼 여러분의 코드는 나와 다른 것에 중복되어 보입니다. – yosukesabai

+0

또한'data_by_symbol'을 list 대신에 dict (코드 어딘가에'date_by_symbol = {}')로 만드는 것이 좋다. 그런 식으로 위의 코드의 마지막 줄에'data_by_symbol [symbol] = rowdate'라고 말하십시오. 그것들을 사용할 때, 당신은 data_by_symbol [mysymbol]을 사용하여 mysymbol에 대한 데이터를 얻거나,'for sym, dat for data_by_symbol.items()'를 사용하여 모든 심볼에 대해 반복 할 수 있습니다. i = 0, i = 1 등의 의미를 추적하는 또 다른 작은 기능은 재미 있지 않습니다. – yosukesabai

6

를 사용하고 있지 않다으로, i 제거있어 rowdata = [] 바로 편집

def create_data_lists(): 

    for symbol in symbols: 
     with open(symbol+'.csv', 'r') as f: 
     print symbol 
     rowdata = [] 
     reader = csv.reader(f) 
     reader.next() 
     for row in reader: 
      rowdata.append(row) 
    data_by_symbol.append(rowdata) 

print i 후 같은이?

list_of_csv_files = [] 

for f in filenames: 
    list_of_csv_files.append(csv.DictReader(open(f))) 

이렇게하면 나중에 같은 일을 할 수 있도록 목록에 독자 자체를 저장할은 :

for row in list_of_csv_files[0]: 
    # do some processing on the row 

이 방법의 가장 큰 장점은 다음 필터 열 같은 물건을 할 수 taht를하다 쉽게, 같은 사용 방법 : 내가 CSV 파일을 읽기 전 (따라서 드 구조) 저장하는 것보다 프로그램에 더 도움이 될 것입니다 의심

one_row = [row["name of column heading"] for row in list_of_csv_files[0]] 
two_rows = [[row["name col 2"], row["name col 2"]] for row in list_of_csv_files[0]] 

. 당신이 정말로 모든 CSV 파일에 읽고 목록에 저장을 할 경우

하지만, 내가이하지 않는 것이 좋습니다,리스트의 목록이 필요합니다, 그것은 집중적 매우 기억 될 것입니다 :

list_of_csv_files = [[]] 

for f in filenames: 
    list_of_csv_files.append([row.values() for row in csv.DictReader(open(f))]) 
+0

나는 더 나은 방법을 배우고 자 열심히 노력하고 있습니다. 저는 독학적이고 초급 단계입니다. 제 의도는 파이썬리스트로 읽은 모든 .csv 데이터에 대해 수학 연산을 수행하는 것입니다.귀하의 게시물에서 목록의 목록을 사용하여 내 코드가 느려질 것입니다. 나는 내가 분석하고있는 .csv 데이터를 쉽게 구별 할 수있는 유일한 방법이기 때문에이 방법을 선택했습니다. 내 목표에 맞는 제안이 있다면, 나는 모든 귀입니다. 감사. – johnjdc

+0

물론, 나는 당신에게 몇 가지 다른 기술을 가르치기 위해 나의 대답을 확장 할 것입니다. – Serdalis