0

これは私のコードです:

#!/usr/bin/python   
#-*-coding:utf-8-*-   

import xlrd,sys,re

data = xlrd.open_workbook('a.xls',encoding_override="utf-8")
a = data.sheets()[0]
s=''
for i in range(a.nrows):
    if 9<i<20:
        #stage
        print a.row_values(i)[1].decode('shift_jis')+'\n'

しかし、それは示しています:

????
????????
??????
????
????
????
????????

それで、なにかお手伝いできますか 、

ありがとう

4

2 に答える 2

2

背景:「最新の」(Excel 97-2003)XLSファイルでは、テキストは事実上Unicodeとして保存されます。古いファイルでは、テキストは8ビット文字列として保存され、「コードページ」レコードは、テキストがどのようにエンコードされているかを示します。たとえば、整数1252は、cp1252またはとして知られているエンコードに対応しwindows-1252ます。いずれの場合も、xlrd抽出されたテキストをUnicodeオブジェクトとして表示します。

次の行をコードに挿入してください。

print data.biff_version, data.codepage, data.encoding

新しいファイルがある場合は、次のように表示されます。

80 1200 utf_16_le

いずれにせよ、結果を報告するために質問を編集してください。

問題1:encoding_overrideファイルが古いファイルであり、コードページレコードが省略されているか間違っていることがわかっている/疑われる場合にのみ必要です。ファイルが新しいファイルの場合は無視されます。ファイルがExcel-97より前であり、テキストがUTF-8でエンコードされていることを本当に知っていますか?もしそうなら、それはいくつかのひどく惑わされたサードパーティのソフトウェアによってのみ作成された可能性があり、Excelでそれを開こうとするとExcelは爆発します。野球のバットで作者を訪ねてください。それ以外の場合は、encoding_overrideを使用しないでください。

問題2:オブジェクトが必要です。unicodeそれらを表示するには、適切なエンコーディングを使用してからそれらをエンコードするデコードしない)必要があります。例外を発生させず、疑問符を印刷するのは非常に驚くべきことです。unicodestrprint unicode_object.decode('shift-jis')

これを理解しやすくするために、コードを次のように変更してください。

text = a.rowvalues(i)[1]
print i, repr(text)
print repr(text.decode('shift-jis'))

結果を報告します。

適切なエンコーディング(ある場合)の選択を支援できるように、使用しているオペレーティングシステムのバージョンと、次の表示を教えてください。

print sys.stdout.encoding
import locale
print locale.getpreferredencoding()

参考文献:

(1)xlrdドキュメント(Unicodeのセクション、正面)...ディストリビューションに含まれているか、ここで最新のコミットを取得します。

(2)PythonUnicodeHOWTO

于 2011-05-20T12:44:36.563 に答える
0

open shift-jis でエンコードのオーバーライドを行わないのはなぜですか?

data = xlrd.open_workbook('a.xls',encoding_override="shift-jis")

ファイルが実際にシフト JIS である場合、有効な UTF-8 コード ポイントと重複しないコード ポイントが多数(率直に言って、ほぼすべて) 存在します。不正な文字 (?) を取得していて、ファイルが実際には UTF-8 であり、Shift-JIS を出力したい場合、出力シェル (印刷用 - おそらくファイルで問題ないでしょう) がエンコーディングを処理できないことをお勧めします。 .

于 2011-05-20T09:00:32.020 に答える