2013-08-26 12 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で移植しました。私はそうしたように、UNIXからWindowsに切り替えました。

このプログラムをスムーズに書き込むにはどうすればよいですか?

注:このバージョンのcsvモジュールでは、公式のマニュアルに従ってUnicode入力をサポートしていませんが、Unicode入力をUnicode入力と指定しています。私はファーストラインUnicodeを作るために、コードを取る場合

全例外

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

Python 2.7の 'csv'モジュールは、** unicodeをサポートしない**として文書化されています。 –

+0

'csvfile_'とは何ですか? Unicodeを自動エンコードする 'io'または' codecs'モジュールでオープンされたオープンファイルオブジェクトですか?もしそうなら、それはCSVモジュールではなく、Unicodeを期待する**その**ファイルオブジェクトです。ファイルオブジェクトを開くコードを教えてください。 –

答えて

13

は残念ながら、3to2io.open()コールの代わりに使用する組み込みのPythonの2 open()取得します関数。これはテキストモードでファイルを開きました。これはPython 3のようにUnicode入力を必要とします。

ただし、csvモジュールは、Unicodeデータをサポートしていません。それは確かにUnicodeを生成しません。

あなたは、Python 2にバイナリモードでファイルを開く必要があります、次のいずれか

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

または内蔵の代わりにopen()呼び出しを使用:あなたは'wb'を使用する必要が

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

をとにかくモードとして。

ユニコードデータを書き出す場合は、の前にのデータを符号化してcsv.writer()オブジェクトに渡す必要があります。 csv module examples sectionには、少し簡単に書く前にUnicodeからエンコードするコードが含まれています。

+0

私はPython 2またはPython 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"です。

関連する問題