1

私はPythonの文字列が==本来あるべきだと思うときにそうではないという問題を抱えています。それはエンコード方法に関係していると思います。基本的に、zip アーカイブに保存されているいくつかのコンマ区切りの値を解析します (興味のある方のために、具体的には GTFS フィード)。

PythonでZipFileモジュールを使用して、zipアーカイブの特定のファイルを開き、そこにあるテキストをいくつかの既知の値と比較しています。ファイルの例を次に示します。

agency_id,agency_name,agency_url,agency_phone,agency_timezone,agency_lang
ARLC,Arlington Transit,http://www.arlingtontransit.com,703-228-7433,America/New_York,en

私が使用しているコードは、テキストの最初の行にある文字列 "agency_id" の位置を識別しようとしているため、後続の行で対応する値を使用できます。コードのスニペットを次に示します。

zipped_feed = ZipFile(feed_name, "r")
agency_file = zipped_feed.open("agency.txt", "r")

line_num = 0
agencyline = agency_file.readline()
while agencyline:
    if line_num == 0:
        # this is the header, all we care about is the agency_id
        lineparts = agencyline.split(",")
        position = -1
        counter = 0
        for part in lineparts:
            part = part.strip()
            if part == "agency_id":
                position = counter              
        counter += 1
        line_num += 1
        agencyline = agency_file.readline()
    else:
        .....

このコードは、一部の zip アーカイブでは機能しますが、他の zip アーカイブでは機能しません。私はいくつかの調査を行い、repr(part) を印刷しようとしましたが、'agency_id' の代わりに '\xef\xbb\xbfagency_id' を取得しました。ここで何が起こっているのか、どうすれば修正できるのか誰か知っていますか? 助けてくれてありがとう!

4

4 に答える 4

5

これはByte Order Markであり、ファイルのエンコーディングを示します。UTF-16 および UTF-32 の場合は、ファイルのエンディアンも示します。それを解釈するか、確認して文字列から削除することができます。それを削除するには、次のようにします。

import codecs

unicode(part, "utf8").lstrip(codecs.BOM_UTF8.decode("utf8", "strict"))
于 2012-06-02T17:45:43.513 に答える
3

入力ファイルは utf-8 のようで、-文字で始まります'ZERO WIDTH NO-BREAK SPACE'

import unicodedata
unicodedata.name('\xef\xbb\xbf'.decode('utf8'))
# gives: 'ZERO WIDTH NO-BREAK SPACE'

これは BOM として使用されます (または、utf8 ではバイト順が実際には正確ではないため、より正確にはファイルを utf8 として識別するために使用されますが、とにかく一般的に BOM と呼ばれます)

于 2012-06-02T17:45:34.213 に答える
0

あなたが持っているのは、ファイルの先頭に Unicode Byte Order マークがある場合があるファイルです。これは、エンコーディングを示すために編集者によって導入されることがあります。

ここにいくつかの詳細があります - http://en.wikipedia.org/wiki/Byte_order_mark

要点は、UTF-8 でエンコードされたデータのマーカーである \xef\xbb\xbf 文字列を探して、それを取り除くことができるということです。または、他の選択肢は、コーデックパッケージで開くことです

with codecs.open('input', 'r', 'utf-8') as file: 

またはあなたの場合

zipped_feed = ZipFile(feed_name, "r")
# adding a StreamReader around the zipped_feed.open(...)
agency_file = codecs.StreamReader(zipped_feed.open("agency.txt", "r"))
于 2012-06-02T17:53:08.423 に答える
0

簡単: zip アーカイブの一部は、文字列の先頭にUnicode BOM (バイト オーダー マーク)を印刷しています。これは、マルチバイト エンコーディングで使用するバイト順を示すために使用されます。これは、Unicode 文字列 (おそらく UTF-16 でエンコードされたもの) をバイト文字列として読み込んでいることを意味します。最も簡単な方法は、文字列の先頭でそれをチェックして削除することです。

于 2012-06-02T17:48:50.627 に答える