2012-07-19 5 views
3

내 Python 스크립트의 목적은 불일치를 찾는 여러 CSV 파일에있는 데이터를 비교하는 것입니다. 데이터 순서는 있지만 파일 순서가 다릅니다. 파일에는 대략 70K 라인이 포함되어 있으며 약 15MB의 무게가 나옵니다. 공상이나 하드 코어는 여기에 없습니다. 내가 제대로 내 CSV 파일에서 읽기Python : 일반 CSV 파일 구문 분석 및 조작

def getCSV(fpath): 
    with open(fpath,"rb") as f: 
     csvfile = csv.reader(f) 

     for row in csvfile: 
      allRows.append(row) 

allCols = map(list, zip(*allRows)) 
  • 암 : 여기에 코드의 일부? csv.reader을 사용하고 있지만 csv.DictReader을 사용하면 도움이 될까요?
  • 정확한 열에 특정 값을 가진 전체 행을 포함하는 목록을 만들려면 어떻게해야합니까? 내가 제대로 질문을 이해한다면
+0

StackOverflow의 단일 질문은 _single_, 좁은 범위, 명확하고 간결하게 설명 된 질문이어야하며 다른 사람들에게 도움이 될만큼 충분히 포괄적이어야합니다. 소란스러운 이야기가 아니라별로. –

+0

@CharlesDuffy "방랑 이야기"를 쓴 이유는 정확하게 내가 읽은 많은 질문들이 분명하지 않기 때문입니다. – CHM

+1

부여되었지만 명확성을 달성하는 데 집중된 산문이 필요합니다. 그렇지 않으면 조명이 아닌 노이즈가 추가됩니다. –

답변

2

모든 행을 계속 유지 하시겠습니까? 이렇게하면 일치하는 값만있는 목록이 만들어집니다. fnameglob.glob() 또는 os.listdir() 또는 다른 데이터 소스에서 가져올 수 있습니다. 당신은 csv.DictReader을 원하는

import csv 

matching20 = [] 

for fname in ('file1.csv', 'file2.csv', 'file3.csv'): 
    with open(fname) as fin: 
     csvin = csv.reader(fin) 
     next(csvin) # <--- if you want to skip header row 
     for row in csvin: 
      if row[20] == 'value': 
       matching20.append(row) # or do something with it here 

당신은 헤더 행을 가지고 이름으로 열을 액세스하려면 그냥 ... 당신은 20 열을 언급,주의, 그러나 21 열 것 [20]을 행합니다.

+0

감사합니다. 내 파일 _does_에 헤더 행이 있지만 이미 관심있는 열 번호를 알고 있습니다. – CHM

+0

@CHM 필요한 경우 헤더 행 건너 뛰기를 포함하는 편집 된 답변 –

1

, 당신은 value은 행에있는 경우 행을 포함 할,하지만 당신은 열 value이 정확한지 몰라?

당신의 행이 목록에있는 경우,이 작동합니다 :

testlist = [row for row in allRows if 'value' in row] 

후 편집 : 당신이 말한대로, 당신은 value 지정된 열에있는 행의 목록을 (원하는 경우

다음 정수 pos, 정의 :.

testlist = [] 
pos = 20 
for row in allRows: 
    testlist.append([element if index != pos else 'value' for index, element in enumerate(row)]) 

(나는이 시험, 그러나 그것은 작동하는 경우에 지금 저를하지 않은)

+0

@ CHM Ahh. 그? 위의 한 문장? * 그것은 유용하고 초점을 맞춘 문제 설명입니다. –

+0

@ CHM 만약 한 문장이 당신의 질문이 실제로 무엇에 관한 것이 었는지 알려줄 필요가 있다면? 의도 한 의미가 주변 산문에 묻히게되면 예, 너무 길어집니다. –

+0

@CHM : 지금 시도하십시오. – aaronlevin

2

이렇게하면 열에 액세스 할 수있는 다른 목록을 만들 필요가 없습니다.

import csv 
import sys 

def getCSV(fpath): 
    with open(fpath) as ifile: 
     csvfile = csv.reader(ifile) 

     rows = list(csvfile) 

    value_20 = [x for x in rows if x[20] == 'value']