2013-08-26 4 views
10
csvfile_ = open(finishedFileName+num+".csv","w",newline='') 
writ = csv.writer(csvfile_, dialect='excel') 
firstline = unicode(str(firstline)) 
try: 
    writ.writerow(firstline) 
except TypeError: 
    print firstline 
    print type(firstline) 
    raise 

이 코드는 TypeError: must be unicode, not str입니다. 첫 번째 줄의 유형을 인쇄 할 때 <type 'unicode'>이 표시됩니다. 첫 줄을 인쇄 할 때 ['project_number', 'project_location']이 표시됩니다 (목록은 길지만 그 스타일은 계속됩니다.)2.7 CSV 모듈이 유니 코드를 원하지만 유니 코드를 원하지 않습니다.

이 프로그램은 python 3.3에서 잘 작동합니다. 필자는 3to2로 이식했고 유닉스에서 윈도우로 전환했다.

이 프로그램을 원활하게 작성하려면 어떻게해야합니까?

참고 :이 버전의 csv 모듈은 공식 설명서에 따라 유니 코드 입력을 지원하지 않지만 어쨌든 유니 코드 입력을 제공하라고 말했습니다.

전체 예외 내가 firstLine의 유니 코드를 만들기 위해 코드를 가지고가는 경우에

Traceback (most recent call last): 
    File "C:\Users\urightswt\Downloads\LogModToConvert.py", line 382, in <module> 
    process(marketingLogExportFileName) 
    File "C:\Users\urightswt\Downloads\LogModToConvert.py", line 123, in process 
    writing(csvfile,modified,firstline) 
    File "C:\Users\urightswt\Downloads\LogModToConvert.py", line 114, in writing 
    writ.writerow(firstline) 
TypeError: must be unicode, not str 

, 내가 대신 불행하게도

Traceback (most recent call last): 
    File "C:\Users\urightswt\Downloads\LogModToConvert.py", line 382, in <module> 
    process(marketingLogExportFileName) 
    File "C:\Users\urightswt\Downloads\LogModToConvert.py", line 123, in process 
    writing(csvfile_,modified,firstline) 
    File "C:\Users\urightswt\Downloads\LogModToConvert.py", line 114, in writing 
    writ.writerow(firstline) 
TypeError: must be unicode, not str 
+0

* 예외 만보고 있습니다. 'TypeError'를 제거하고 전체 추적을 살펴보십시오. –

+1

파이썬 2.7의'csv' 모듈은 유니 코드를 지원하지 않는 것으로 문서화되어 있습니다 **. –

+0

'csvfile_'이란 무엇입니까? 'io' 또는'codecs' 모듈로 열린 열린 파일 객체입니까, 유니 코드를 자동 인코딩합니까? 그렇다면 ** CSV 모듈이 아닌 유니 코드를 기대하는 ** 파일 개체입니다. 파일 객체를 여는 코드를 보여주십시오. –

답변

13

얻을 3to2 대신의 io.open() 전화를 사용하는 내장 파이썬 2 open() 기능. 이 파일을 텍스트 모드로 열었습니다. 파이썬 3에서는 유니 코드 입력이 필요합니다.

그러나 csv 모듈은 유니 코드 데이터를 지원하지 않습니다. 그것은 확실히 유니 코드를 생성하지 않습니다.

당신은 파이썬 2 바이너리 모드로 파일을 열어야 할 것 중 하나

mode = 'w' 
if sys.version_info.major < 3: 
    mode += 'b' 
csvfile_ = open(finishedFileName + num + ".csv", mode, newline='') 

또는 사용하는 내장 대신 open() 전화 : 당신이

csvfile_ = open(finishedFileName + num + ".csv", 'wb') 

'wb'를 사용하는 어쨌든 모드로.

유니 코드 데이터를 쓰려면 을 인코딩 한 후csv.writer() 개체로 전달해야합니다. csv module examples section에는 유니 코드에서 인코딩하기 전에 약간의 코드를 작성하는 코드가 포함되어 있습니다.

+0

파이썬 2 또는 파이썬 3과 함께 실행되어야하는 CSV 처리 프로그램을 작성하려고했는데이 답변이 검색 엔진을 통해 발견되어 도움이되었습니다. 나는 그것을 upvote 최초의 사용자가 놀랍군요. –

+0

첫 번째 스 니펫에서'future.builtins import open'을 놓친 것일까? 나는'newline'이 Python 2에서 공개되지 않았다고 생각한다. –

+0

@mose : 답변의 요점입니다. 질문에 대한 의견도 참조하십시오. 가져 오기는'from io import open'입니다. 'future_builtins'는'open'을 포함하지 않습니다. 나는'3to2' 코드와 호환되도록 옵션을 제안했다. –

0

나는 open()과 csv에서 같은 문제가있었습니다. 친구가 나에게 open() 대신 open_output()을 사용하는 해결책을 주었다. open_output()의 기본값은 텍스트가 아닌 "wb"입니다.

관련 문제