私は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警告を受け取ります。
何が起こっているのかを理解して修正できるようにしたいのですが、私が考えることができるすべての場所を使い果たしました