あなたは説明を求めましたが、現象のいくつかは、あなたの助けなしに不可解です。
(A)Excel 97以降で作成されたXLSファイルの文字列は、可能であればUTF16LEでLatin1でエンコードされます。各文字列には、どちらが使用されたかを示すフラグが付いています。以前のコード化された文字列をユーザーの "コードページ"に従って抽出します。いずれにしても、xlrdはユニコードオブジェクトを生成します。ファイルのエンコーディングは、コードページが省略されているか、またはそれに関するものであるサードパーティのソフトウェアによってXLSファイルが作成された場合にのみ重要です。 xlrdドキュメントの前のUnicodeセクションを参照してください。
(B)原因不明の現象:
このコード:
bcw = csv.writer(bc,csv.excel,b.encoding)
は、Python 2.5、2.6および3.1で次のエラーが発生します。TypeError: expected at most 2 arguments, got 3
- これは私がドキュメント与えられた期待するものについてですon csv.writer; (1)何もない(2)方言または(3)1つまたは複数の書式設定パラメータのいずれかが続くファイルライクなオブジェクトが必要です。あなたはそれに方言を与えました、そして、csv.writerはエンコード引数を持っていません。どのバージョンのPythonを使用していますか?または、実際に実行したスクリプトをコピー/ペーストしませんでしたか?
(C)トレースバックの周りに原因不明の現象と実際の問題のデータが何であったか:まず
"the_script.py", line 40, in <module>
this_row.append(str(s.cell_value(row,col)))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xed' in position 5: ordinal not in range(128)
、簡略化されたスクリプトではありませんでした問題のあるコード行のstrが()があります - あなたをしましたあなたは実際に走ったスクリプトをコピー/ペーストしませんか?いずれにしても、一般的にはstrを使うべきではありません。浮動小数点数の完全な精度は得られません。 csvモジュールに変換させてください。
"516-777316" - 元のExcelシートのテキストは "516-7773167"(最後は7)です。 "" --- 7がどのように最後から失われるのか想像するのは難しいです。私は、問題のデータだった正確に何を見つけるために、このようなものを使用したい:
try:
str_value = str(s.cell_value(row, col))
except:
print "row=%d col=%d cell_value=%r" % (row, col, s.cell_value(row, col))
raise
% rはcell_value=%s ... repr(s.cell_value(row, col))
を入力してからあなたを節約すること...のrepr()を、あなたのデータの明確な表現を生成します。勉強しなさい。これを使って。
どのように「516-777316」に到着しましたか?
THIRDLYの場合、エラーメッセージは実際にはオフセット5(つまり6番目の文字)のユニコード文字「 'xed」について不平を言っています。 U + 00EDはラテン小文字ですが、私は急いでいて、「516-7773167」には何もありません。
4つ目は、エラーの位置が動くターゲットのようです。解決策: "エラーはbcw.writerowにあります。"ハァッ? str(a_unicode_object)
は、ユニコードオブジェクトをstrオブジェクトに変換しようとしますが、エンコーディング情報がない場合はasciiを使用しますが、ASCII以外のデータがある場合は、だからスプラット。あなたのオブジェクトはutf8でエンコードされたcsvファイルを生成することですが、単純化されたスクリプトはどこにでもutf8は言及していません。 s.cell_value)
の代わりに、s.cell_value)
の代わりに、シェイプを使用すると、ドキュメント全体がエラーなく書き込まれます。出力は特に望ましくありません(テキスト:u'516-7773167 「) 『』」CSVライターがあなたのCellオブジェクトの__str__
メソッドを呼び出して、これは、デバッグのために有用である可能性が<type>:<repr(value)>
を生成するが、あなたのcsvファイルではそれほど大きくない言うように。
ので起こって
(F)Alex Martelliの解答は素晴らしいですが、xlrd docsのCellクラスのセクションを読むべきです:セルのタイプはテキスト、数値、ブール値、日付、エラー、空白、空です。よあなたは日付を持っていますが、数値ではない日付に書式を設定したいので、isinstance()を使用することはできません(とにかく関数呼び出しのオーバーヘッドが必要ないかもしれません)...これはCell.ctype
属性とSheet.cell_type()
ですSheet.row_types()
メソッドはのためのものです。
(G)UTF8はUnicodeではありません。 UTF16LEはUnicodeではありません。 UTF16はUnicodeではありません...個々の文字列がUTF16 BOMでそれぞれ2バイトを無駄にするという考え方は、MSでも考慮するにはあまりにも不条理です:-)
(H)さらに読む(xlrdドキュメントから離れて)
http://www.joelonsoftware.com/articles/Unicode.html
http://www.amk.ca/python/howto/unicode
誰がエラーを投げているのかを知るために、トレースバック全体を確認すると便利です。 – Christopher
これ以上見ることはできません: ファイル "the_script。(ascii)codecは位置5の文字 '' xed 'をエンコードできません:序数が範囲内にありません。 (128) – anschauung
"Excelからの出力をUnicodeで"とすると、 "Excelからの出力をUTF-16で"という意味になります。Unicodeは、UTF-8やUTF-16のような異なるエンコーディングシステムで表現されるコードスペースを定義します。 – Svante