2011-04-12 7 views
7

파이썬의 csv 작성기를 사용하여 고정 폭, 공백 구분 및 최소 인용 CSV 파일을 작성하고 싶습니다. 출력 예 :파이썬에서 고정 폭, 공백으로 구분 된 CSV 출력 쓰기

item1   item2 
"next item1" "next item2" 
anotheritem1 anotheritem2 

제가

writer.writerow (("{0 : 15S}"을 사용하는 경우. 형식 (항목 1). "{0 : 15S를}"형식 (항목 2))) ...
다음

, 공간 분리와 포맷이 후미 공간으로 인하여 추가 시세 또는 이스케이프합니다 (csv.QUOTE_에 따라 상수 *) 중 하나로 깨 항목 형식 :

물론
"item1   " "item2   " 
"next item1  " "next item2  " 
"anotheritem1 " "anotheritem2 " 

, 나는 모든 것을 나 자신을 포맷 할 수 있습니다 :

writer.writerow ((. "{0 : 15 초} {1 : 15 초}"형식 (항목 1을 항목 2)))

하지만 csv 작성기 사용에 별다른 의미가 없습니다. 또한, 공간을 항목에 포함하고 따옴표/이스케이프를 사용해야 할 경우 수동으로 정렬해야합니다. 즉, "QUOTE_ABSOLUTELYMINIMAL"csv 상수가 "QUOTE_MINIMAL"역할을하지만 후행 공백을 무시할 필요가있는 것 같습니다.

"QUOTE_ABSOLUTELYMINIMAL"동작 또는 파이썬의 CSV 모듈을 사용하여 고정 폭, 공백으로 구분 된 CSV 출력을 얻는 다른 방법을 얻을 수있는 방법이 있습니까?

CSV 파일에서 고정 폭 기능을 사용하려는 이유는 더 읽기 쉽습니다. 따라서 읽기 및 쓰기 모두 CSV로 처리되지만 열 구조로 인해 더 잘 읽을 수 있습니다. csv skipinitialspace 옵션은 여분의 공백을 무시하므로 읽을 때 문제가되지 않습니다. 놀랍게도, 글쓰기가 문제가되는 것 같습니다 ...

편집 : 나는 현재의 CSV 플러그인으로는 성취하기가 불가능하다고 결론을 내립니다. 그것은 내장 된 옵션이 아니며, 파이썬의 csv 작성자가 따옴표를 사용하거나 이스케이프 처리하지 않고 별도의 구분 기호를 쓰는 방법이 없기 때문에 수동으로 구현하는 방법을 알 수 없습니다. 따라서 필자는 아마도 자신의 CSV 작성자를 작성해야 할 것입니다.

답변

0

이 활성 상태 조리법 방법을 보여줍니다 파이썬에서 출력 테이블 화 된 데이터에 : http://code.activestate.com/recipes/267662-table-indentation/

당신은 당신이 원하는 것을 할 그 예에서 충분히 수집합니다 할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 그러나 링크 된 코드는 Python의 csv 플러그인을 사용하지 않으며 csv 출력용으로 사용되지 않습니다. 내 자신의 csv 작가를 작성하는 것은 가능하지만이 목적을 위해 파이썬의 것을 사용하는 방법이 있기를 바라고 있습니다 ... – jvm

2

이것은 무엇을 당신을 위해합니까? 나는 당신이 정말로 단지 csv.QUOTE_NONE 상수를 놓치고 있었다고 생각한다.

import csv 
csv.register_dialect('spacedelimitedfixedwidth', delimiter=' ', quoting=csv.QUOTE_NONE) 
with open('crappymainframe.out', 'rb') as f: 
    reader = csv.reader(f, 'spacedelimitedfixedwidth') 

csv 모듈의 맨 아래에있는 unixpwd dialect 예제의 수정 사항입니다.

+1

이 독자의 예제가 어떻게 작가 문제를 해결할 수 있는지 보지 못합니까? csv.QUOTE_NONE도 도움이되지 않습니다.이 경우, 항목의 후행 공백은 이스케이프 처리됩니다. – jvm

8

기본 문제는 csv 및 고정 형식이 기본적으로 데이터 저장보기에 반대한다는 것입니다. 그것들을 함께 작동시키는 것은 일반적인 관행이 아닙니다.당신은 단지 그들에 공백이있는 항목에 따옴표가있는 경우 또한, 그것은 해당 행에 정렬을 던질 것이다 :

testing  "rather hmm " 
strange  "ways to " 
"store some " "csv data " 
testing  testing  

뿐만 아니라 잘못된 결과의 결과에 다시 데이터를 읽기 :

'testing' 'rather hmm ' 
'strange' 'ways to ' 
'store some ' 'csv data ' 
'testing' 'testing' '' 

마지막 행 끝에있는 추가 필드를 확인하십시오. 이러한 문제점을 감안할 때, 나는 기존의 CSV 라이브러리를 생성하기 쉽고, 다시 읽을 때 올바르게 구문 분석됩니다 나는 매우 읽을 찾을

"item1   " "item2   " 
"next item1  " "next item2  " 
"anotheritem1 " "anotheritem2 " 

의 귀하의 예제와 함께 갈 것입니다. 여기에 내가 생성하는 데 사용되는 코드는 이 :

import csv 

class SpaceCsv(csv.Dialect): 
    "csv format for exporting tables" 
    delimiter = None 
    doublequote = True 
    escapechar = None 
    lineterminator = '\n' 
    quotechar = '"' 
    skipinitialspace = True 
    quoting = csv.QUOTE_MINIMAL 
csv.register_dialect('space', SpaceCsv) 

data = (
     ('testing ', 'rather hmm '), 
     ('strange ', 'ways to '), 
     ('store some ', 'csv data '), 
     ('testing ', 'testing '), 

temp = open(r'c:\tmp\fixed.csv', 'w') 
writer = csv.writer(temp, dialect='space') 
for row in data: 
    writer.writerow(row) 
temp.close() 

당신은 물론, 모든 데이터가 동일한 길이로 패딩이 있어야합니다, 중 모든이 작업을 수행하거나 함수 자체의 기능에 도착하기 전에. 아, 그리고 숫자 데이터를 가지고 있다면 패딩 허용량을 만들어야합니다.