2012-09-06 7 views
19

저는 파이썬에 대해 매우 익숙합니다.파이썬 구문 분석 CSV가 올바르게

1997,Ford,E350,"Super, luxurious truck"

('1997', 'Ford', 'E350', 'Super, luxurious truck')

및 NOT 위

('1997', 'Ford', 'E350', '"Super', ' luxurious truck"')

로 분할되어야한다 예를 들어, 내가 무엇을 얻을입니다 - 나는 그것이 인용 값을 인식 할 수 있도록 csv 파일을 구문 분석 할 str.split(,)과 같은 것을 사용하면됩니다.

어떻게하면됩니까? 또한이 값을 배열이나 다른 데이터 구조에 저장하는 것이 가장 좋을까요? 왜냐하면 CSV에서이 값들을 얻은 후에는 쉽게 선택할 수 있기를 원하기 때문에 두 열을 말하고 다른 배열이나 다른 데이터 구조로 저장할 수 있기 때문입니다.

+0

내가 질문을 편집했습니다. 단락 기호 '만 사용하면 따옴표 안에', '를 인식하지 못합니다. – cornerstone

+0

'견적 '을 정의해야합니다. –

답변

14

방법이 완벽하게 작동했습니다

d = {} 
d['column1name'] = [] 
d['column2name'] = [] 
d['column3name'] = [] 

dictReader = csv.DictReader(open('filename.csv', 'rb'), fieldnames = ['column1name', 'column2name', 'column3name'], delimiter = ',', quotechar = '"') 

for row in dictReader: 
    for key in row: 
     d[key].append(row[key]) 

열은 열 이름을 키로하여 사전에 저장됩니다.

+0

col3name 앞에 작은 따옴표가 시작되지 않았습니다. – codingknob

18

당신은 csv 모듈을 사용한다 :

import csv 
reader = csv.reader(['1997,Ford,E350,"Super, luxurious truck"'], skipinitialspace=True) 
for r in reader: 
    print r 

출력 :

['1997', 'Ford', 'E350', 'Super, luxurious truck'] 
+0

감사합니다. 그러나 파일에서 읽으려고 할 때'csv.Error : 줄에 NULL 바이트가 들어 있습니다. ' 내 파일에 다음과 같이 백만 줄이 포함되어있을 수 있습니다. - '1 ,, "경고, 알 수없는 오류입니다." "car-8554.gif", "car.gif", "crs_04", "rand str 변경, pos 35289, 크기 9242 추가" – cornerstone

+0

@cornerstone : 어떻게이 파일을 만드시겠습니까? 정상적인 방법으로 여기에 NULL 바이트를 표시하지는 않겠지 만, 파일에있는 경우 텍스트로 취급하면 거의 모든 방법을 통해 읽을 수 있습니다. – geoffspear

+0

@wooble 그것은 SQL 데이터 값을 csv 파일에 덤프함으로써 생성되었습니다. null 값이 연속적인 ",,"행에 존재하기 때문이라고 생각했습니다. 그 해결책을 찾았습니다. (csv_file의 행에 대해 line.replace ('\ 0', '')), 구분 기호 = ',', quotechar = ' "') ... print (reader.next())' – cornerstone

5

당신은 csv.reader() 문 이내에서 quotechar로 doublequote를 정의 할 필요를 다음

>>> with open(r'<path_to_csv_test_file>') as csv_file: 
...  reader = csv.reader(csv_file, delimiter=',', quotechar='"') 
...  print(reader.next()) 
... 
['1997', 'Ford', 'E350', 'Super, luxurious truck'] 
>>> 
1

CSV 모듈을 사용하지 않으려면 정규 표현식을 사용해야합니다. 이 시도 :

import re 
array = re.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", '1997,Ford,E350,"Super, luxurious truck"') 

을 당신이 시도하는 경우 :

print(array[3]) 

당신이 얻을 것이다 :

"Super, luxurious truck"