2012-02-25 18 views
1

xlsファイル(MHTML形式)を読み込むプログラム(Python 2.7)で作業しています。私が持っている問題の1つは、ファイルにasciiではない記号/文字が含まれていることです。私の最初のソリューションは、ここでユニコードUnicode文字のエンコードとデコードの処理方法を教えてください。

を使用してファイルを読むことだった私は、ファイルに読んでいるかである:

theString=unicode(open(excelFile).read(),'UTF-8','replace') 

私はその後、いくつかの処理を行うためにlxmlのを使用しています。これらのファイルには多くのテーブルがあります。処理の最初のステップでは、適切なテーブルを見つける必要があります。私は最初の行の最初のセルにある単語に基づいてテーブルを見つけることができます。これが難しいところです。私は正規表現を使ってセルのtext_content()をテストすることを望んでいましたが、単語のバリエーションが多すぎることを発見しました(3,200ファイルのテストランでは91の異なる方法を見つけました。テーブルが発現された。従って私は、特定の細胞のtext_contentsの全てをダンプ厳密変異体の全てを識別するために、Excelの一部algorithimsを使用することを決めた。

IはTEXT_CONTENTを書き込むために使用されるコードは、()

ました
headerDict['header_'+str(column+1)]=encode(string,'Latin-1','replace') 

これは私の場合と同様の質問に対する以前の回答に基づいていますが、ここでは、ファイルがユニコードで読み込まれ、ファイルが書き出される直前にエンコードされているようです。

Excelでラベル/単語を処理して、すべて小文字に変換し、スペースを取り除き、出力をテキストファイルとして保存しました。

を使用して初めて、私はそれを読んでなかった -

テキストファイルには、私は、ファイルに読んでいます

をラベル付けされて探していますテーブルは、ユニークな方法のすべての列を持っています
labels=set([label for label in unicode(open('C:\\balsheetstrings-1.txt').read(),'UTF-8','replace').split('\n')]) 

私はユニコードが

u'unauditedcondensedstatementsoffinancialcondition(usd\ufffd$)inthousands' 
以下の例のようにufffd \で特定のキャラを置き換えることを発見し、私のプログラムを実行し、いくつかの一致が発生しなかったことを発見し、それを調査しますUnicodeに文字のマッピングがない場合(おそらく正確な説明ではなく、私の解釈である)、置換が行われるようになります。

それで、ユニコードを使用せずにラベルの私のリストに。だから私はこのコードを使用してそれを読む:

labels=set(open('C:\\balsheetstrings-1.txt').readlines()) 

は今、私は

'unauditedcondensedstatementsoffinancialcondition(usd\xa0$)inthousands' 

を参照してくださいインタプリタで同じラベルを見て、私はその後、一致するラベルのこのセットを使用しようと、私はこのエラーを取得します

Warning (from warnings module): 
File "C:\FunctionsForExcel.py", line 128 
if tableHeader in testSet: 
UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal 

今すぐイライラする事は、それは私がこの

を受け破った後、私はするtableHeaderの値を求めるときにするtableHeaderの値がテストセットではないということです
'fairvaluemeasurements:' 

そして、私はそれが正しく偽

を返すアイドル

tableHeader in testSet 

にテストを入力すると傷害に侮辱を追加するために、私はコード「\ XA0は」非破壊のためのコードであることを理解スペース。私はユニコードを使わずにそれを読むと、Pythonもそうです。私はExcelのすべてのスペースを取り除く得ていたが、私はそれらを分割し、これらを処理するために考えられた後、私はまだ、まだ疑問にもらっていない彼らに

labels=[''.joiin([word for word in label.split()] for label in labels]) 

に参加しました。申し訳ありませんが、私はまだこの周りに頭を抱えようとしています。ここで私は一貫性のない行動に取り組んでいるようです。私が最初に文字列を読み、ユニコードとUTF-8を使用すると、すべての文字が保持され/転送可能になりました。私はそれらを書き出すためにそれらをエンコードし、彼らはExcelでうまく表示され、その後私はそれらをtxtファイルとして保存し、彼らは大丈夫と見えました。しかし、何かが起こっていると私はどこを把握するように見えることができません。

正しいラベルを識別するために文字列を書き出すことを避けることができれば、私の問題は解決するだろうが、2万以上のラベルがあると感じている。潜在的なリストを大幅に減らすために正規表現を使うことができますが、その中には検査が必要なものがあります。さておき、私はソースはすべて私はユニコードを使用して、ラベルのsourcedocumentとリストを読んだとき、私はラベルので、いくつかのマッチを作るために失敗したcharset =「UTF-8」

Recap-を指定したファイルに注意するように

いくつかの文字がufffdに置き換えられました。ユニコードとラベルのリストを特別な処理なしで使用してソースドキュメントを読むと、警告が表示されます。

私はので、私はそれを修正することができますが起こっているかを理解したいと思いますが、私は

答えて

1

「\ xa0」というコードは、改行しないスペースのコードです。

バイト文字列の\xA0は、いくつかのエンコーディングで改行なしのスペースを表すバイトです。それらの可能性が最も高いのはWindowsコードページ1252(西ヨーロッパ言語)です。しかしそれは確かにUTF-8ではなく、\xA0バイトは無効です。

.decode('cp1252')を使用して、そのバイト文字列を'utf-8'の代わりにUnicodeに変換します。一般に、HTMLファイルのエンコーディングを知りたい場合は、<meta http-equiv="Content-Type">タグのcharsetパラメータを探します。輸出されたものによって異なる可能性があります。

+0

------ = _ NextPart_12bb7e4c_1052_474f_96bf_94eba3dbc1c8 コンテンツの場所:file:/// C:/12bb7e4c_1052_474f_96bf_94eba3dbc1c8/Worksheets/Sheet05.html Content-Transfer-Encoding:quoted-printable Content-Type:text/html; US-ASCIIとUTF-8の両方が指定されていることに注意してください。 – PyNEwbie

+0

Wow、面白いことに二重無効です。 'Content-Type'メールヘッダーは' 'タグを上書きするべきですが、いずれの場合でも' utf-8'と 'us-ascii'のどちらも正しいエンコーディングではありません。この場合、あなたができることは、推測です! – bobince

+0

これらのファイルはExcelで作成されているので、すべてが正しくExcelで表示されるため、正しいエンコーディングになると思います。 – PyNEwbie

0

ない正確に解決策を探すために考えることができるすべての場所を使い果たしてしまったが、xlrdのようなものは、おそらく多くの理にかなってそれらのすべてのフープを飛び越えるよりも。

+0

ありがとうございますが、実際にはファイル内のデータを処理する上で必要なことはしません。 – PyNEwbie

2

You read (and write) encoded files like this:

import codecs 
# read a utf8 encoded file and return the data as unicode 
data = codecs.open(excelFile, 'rb', 'UTF-8').read() 

使用するエンコーディングは、限り、あなたはユニコードですべての比較を行うよう関係ありません。

+0

この回答をありがとう、私はそれを試さなければならないが、ファイルはMHTMLファイルであるバイナリではない。それはExcelで開きますが、セル内の値を指定するためにマークアップが使用されています。なぜユニコード(openetc)と違うのか分かりません。 – PyNEwbie

+0

@PyNEwbie:バイナリ形式のすべてのファイル。テキストモードでファイルを開くと、自動的にそのファイルがasciiとしてデコードされますが、これはあなたが望むものではありません。 –

+0

もちろん、すべてのファイルはバイナリですが、実用的なものと正確なものを話しています。特別な埋め込み制御文字が含まれていない場合、ファイルをバイナリにするとは考えていません。ファイルの内容を表示したり、エディタで変更したり、プリンタで印刷することができます。 – PyNEwbie

関連する問題