2017-09-20 1 views
0

목록이있는 사전을 가져 와서 해당 목록을 CSV 파일에 쓰는 스크립트를 작성하려고합니다. 다음과 같이 내가 가진 코드는 다음과 같습니다csv.writerows는 출력 CSV 파일에 목록을 문자열로 씁니다.

import csv 

data = {'a': [1, 2, 3, 4], 'b': [5,6,7,8]} 
shape = {'a': ['round', 'square'], 'b': ['triangle', 'oval']} 
size = {'a': [100, 1000], 'b': [750, 750]} 

with open('test.csv', 'w+') as f_raw: 
    writer = csv.writer(f_raw, delimiter=',', lineterminator='\n') 
    for id in data.keys(): 
     line = [id, data[id], shape[id], size[id]] 
     writer.writerow(line) 

출력 CSV 파일은 그 캐릭터 만들기, 모든 목록은 인용 부호로 묶

a,"[1, 2, 3, 4]","['round', 'square']","[100, 1000]" 
b,"[5, 6, 7, 8]","['triangle', 'oval']","[750, 750]" 

의 형식을 취합니다. 목록으로 남아 있기를 바랍니다. 그래서 읽을 때, 파이썬은 그것들을 문자열이 아닌 목록으로 인식합니다. 이 문제의 원인은 무엇입니까? I 파이썬 3.6

+0

이 사용 사례는 json을 조사해야합니다. –

+1

이것은 csv 형식을 손상시킬 것입니다. 쉼표가 포함 된 데이터를 추가하기 때문에 따옴표가 추가되고 구분 기호는 쉼표입니다. Chet와는 다른 형식으로 살펴보고 싶을 것입니다. 쉼표가 열 또는 구분 기호에있는 데이터의 일부인지 여부를 판별하기는 어렵습니다. – Kyle

+2

파이썬이 그들을 읽으면 * lists *로 인식되지 않습니다. 파이썬은 어쨌든 * 문자열로 그것들을 읽을 것입니다. * 당신은 * 객체 직렬화를 찾고있는 것처럼 들립니다. CSV (예 : DataFrame, 문자열의 간단한 목록)에서 개체를 쉽게 재구성 할 수없는 경우 CSV가 적합하지 않습니다. JSON이나'pickle'을 조사해야하는데, 후자는 거의 모든 Python 객체를 지원해야하며, 전자는 숫자, 문자열, 없음, 목록 또는 딕트가있는 목록 및 딕트를 지원합니다. JSON은 꼭 필요한 것 같아서'json' 모듈을 사용하십시오. –

답변

0

csvwriterow 모듈을 사용하고

입력 (또는 listtuple 확인하다)과 같은 순서 걸린다. 각 항목에 대해 문자열 표현으로 변환합니다. 정수는 & 수레 (및 문자열)로 적합합니다.

그러나 목록의 경우 기대하는 바가 아닙니다.

해결 방법 : 그냥 같이 목록을 추가하여 행을 작성 : 데이터와

with open('test.csv', 'w',newline="") as f_raw: 
    writer = csv.writer(f_raw, delimiter=',', lineterminator='\n') 
    for id in data.keys(): 
     line = [id] + data[id] + shape[id] + size[id] 
     writer.writerow(line) 

를, 파일은 이제 포함

b,5,6,7,8,triangle,oval,750,750 
a,1,2,3,4,round,square,100,1000 
+0

입력 해 주셔서 감사합니다! 내 목록의 길이가 정적이라면이 트릭을 확실히 할 수 있습니다. 그러나 목록의 길이는 동적입니다. (미안하지만, 질문에 지정해야합니다) 목록의 길이를 출력 CSV 파일 내의 데이터 위치에 매핑하는 간단한 방법을 생각할 수 없습니다. – user7525801

0

이 직접 문제를 해결할 수 있지만, 당신은 경우 그런 다음

a = ["[1, 2, 3, 4]","['round', 'square']","[100, 1000]"]

같은 목록 확실히 편리 할 것이다 다음 당신은 항상 자신의 원래 형태로 다시 문자열로 변환 할 수 있습니다

from ast import literal_eval 
>>> a = ["[1, 2, 3, 4]","['round', 'square']","[100, 1000]"] 
>>> list(map(literal_eval, a)) 
[[1, 2, 3, 4], ['round', 'square'], [100, 1000]] 

literal_eval에서.

관련 문제