1

私はxlsファイル(MHTML形式)を読み取るプログラム(Python 2.7)に取り組んでいます。私が抱えている問題の1つは、ファイルにASCIIではない記号/文字が含まれていることです。私の最初の解決策は、Unicodeを使用してファイルを読み取ることでした

これが私がファイルを読んでいる方法です:

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

次に、lxmlを使用して処理を行います。これらのファイルには多くのテーブルがあります。処理の最初のステップでは、適切なテーブルを見つける必要があります。最初の行の最初のセルにある単語に基づいてテーブルを見つけることができます。これは、トリッキーになるところです。正規表現を使用してセルのtext_content()をテストしたいと思っていましたが、単語のバリエーションが多すぎることがわかりました(3,200ファイルのテスト実行で、1つだけを定義する概念が91の異なる方法を見つけましたテーブルが表現されたため、特定のセルのすべてのtext_contentsをダンプし、すべてのバリアントを厳密に識別するために、いくつかのアルゴリズムを優れた方法で使用することにしました。

text_content()を書くために使用したコードは

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

これは、Unicodeを使用してファイルを読み取り、ファイルが書き出される直前にエンコードすることがコンセンサスであると思われる、ここでの私のような質問に対する以前の回答に基づいて行いました。

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

テキストファイルには、私が探しているテーブルにラベルが付けられているすべてのユニークな方法の列があります

それから私はファイルを読んでいます-そして私が初めてそれを読んだのは

labels=set([label for label in unicode(open('C:\\balsheetstrings-1.txt').read(),'UTF-8','replace').split('\n')])

プログラムを実行したところ、一部の一致が発生しなかったことがわかりました。調査したところ、以下の例のように、unicodeが特定の文字を\ufffdに置き換えていることがわかりました。

u'unauditedcondensedstatementsoffinancialcondition(usd\ufffd$)inthousands'

より多くの研究は、ユニコードが文字のマッピングを持っていないときに置換が起こることを発見しました(おそらく正確な説明ではありませんが、それは私の解釈でした)

そこで、(何を失う必要があるかを考えた後)ユニコードを使用せずにラベルのリストを読み取ろうとしました。だから私はこのコードを使ってそれを読んだ:

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

正しくfalseを返します

コード'\xa0'がノーブレークスペースのコードであることを理解しています。ユニコードを使用せずにPythonを読み込むと、Pythonも同様になります。私はExcelのすべてのスペースを取り除いたと思っていましたが、これらを処理するために、それらを分割してから結合しました

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

まだ質問はありません。申し訳ありませんが、私はまだこれに頭を悩ませようとしています。私はここで一貫性のない行動を扱っているように思えます。私が最初に文字列を読み、UnicodeとUTF-8を使用したとき、必要に応じてすべての文字が保存/転送可能でした。それらをエンコードして書き出すと、Excelで正常に表示され、txtファイルとして保存したところ、問題ないように見えましたが、何かが起こっており、どこにあるのかわかりません。

正しいラベルを識別するために文字列を書き出すのを避けることができれば、問題はなくなると思いますが、ラベルは20,000以上あります。正規表現を使用して潜在的なリストを大幅に削減できますが、一部の式では検査が必要です。

余談ですが、ソースファイルはすべてcharset='UTF-8'を指定していることに注意してください

要約-Unicodeを使用してソースドキュメントとラベルのリストを読み取ると、ラベルの一部の文字がufffdに置き換えられているため、一致するものがありません。また、Unicodeを使用してソースドキュメントとラベルのリストを読み取ると、特別な処理を行わずにI警告を受け取ります。

何が起こっているのかを理解して修正できるようにしたいのですが、私が考えることができるすべての場所を使い果たしました

4

3 に答える 3

2

次のようにエンコードされたファイルを読み取り(および書き込み)ます。

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

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

于 2012-02-25T17:24:49.700 に答える
1

コード'\xa0'がノーブレークスペースのコードであることを理解しています。

バイト文字列で\xA0は、はいくつかのエンコーディングでノーブレークスペースを表すバイトです。それらの中で最も可能性が高いのは、Windowsコードページ1252(西ヨーロッパ)です。\xA0しかし、バイト自体が無効であるUTF-8ではありません。

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

于 2012-02-25T23:48:40.400 に答える
0

正確には解決策ではありませんが、xlrdのようなものは、これらすべてのフープを飛び越えるよりもはるかに理にかなっているでしょう。

于 2012-02-25T16:54:34.587 に答える