web-dev-qa-db-ja.com

pythonのWindows-1252(cp1252)ファイルからテキストを正しく読み取る

だから大丈夫、タイトルが私が持っている問題を示唆しているようにpythonでwindows-1252エンコードされたファイルからの入力を正しく読み、入力をSQLAlchemy-MySqlテーブルに挿入することです。

現在のシステム設定:
Windows 7 VMファイルを出力する「Roger Access Control System」を使用。
Ubuntu 12.04 LTS VM Windowsシステムへの共有フォルダーがあるため、「Python 2.7.3」を使用してファイルにアクセスできます。

実際の問題については、入力ファイルについて、Roger Access Control System(詳細はroger.pl)を介してWindows 7システムで生成されるファイルを含む「VM共有フォルダー」があり、このファイルは「 PREvents.csv」は、そのコンテンツに「;」を提示しますデータの分離リスト。

データの形式の例:

_2013-03-19;15:58:30;100;Jānis;Dumburs;1;Uznemums1;0;Ieeja;
2013-03-19;15:58:40;100;Jānis;Dumburs;1;Uznemums1;2;Izeja;
_

4番目のフィールドにはカード所有者の名前が含まれ、5番目には所有者の姓が含まれ、6番目には所有者が割り当てられたグループが含まれます。

問題は、上記の3つのフィールドのいずれか1つがラトビア語に固有の文字を含むことができるという事実に由来します。サンプルファイルでは、単語「Jānis」には文字「ā」が含まれ、Unicodeでは257です。

私が慣れているように、私はそのようなファイルを開きます:

_try:
    f = codecs.open(file, 'rb', 'cp1252')
except IOError:
    f = codecs.open(file, 'wb', 'cp1252')
_

これまでのところ、すべてが機能します-ファイルを開くので、ファイルの各行を反復処理します(これは連続実行スクリプトなので、ループをご容赦ください)。

_while True:
    line = f.readline()

    if not line:
        # Pause loop for 1 second
        time.sleep(1)
    else:
        # Split the line into list
        date, timed, userid, firstname, lastname, groupid, groupname, typed, pointname, empty = line.split(';')
_

そして、これが問題の始まりです。print repr(firstname)を出力すると_u'J\xe2nis'_が出力されます。
イベントタイプに応じてさらにループを下って、変数をSQLAlchemyオブジェクトに割り当て、挿入/更新します。

_if typed == '0':  # Entry type
    event = Events(
        period,
        fullname,
        userid,
        groupname,
        timestamp,
        0,
        0
    )
    session.add(event)
else:  # Exit type
    event = session.query(Events).filter(
        Events.period == period,
        Events.exit == 0,
        Events.userid == userid
    ).first()
    if event is not None:
        event.exit = timestamp
        event.spent = timestamp - event.entry

# Commit changes to database
session.commit()
_

回答の検索で、使用するデフォルトのエンコーディングを定義する方法を見つけました。

_import sys
reload(sys)
sys.setdefaultencoding('utf-8')
_

それは私を何の助けにもしませんでした。

基本的に、これはすべて、正しい所有者の姓/名、およびラトビア固有の文字のいずれかを含むグループ名が割り当てられた所有者を挿入できないことにつながります。

_Instead of the character "ā" it inserts "â"
_

また、「PREvents.csv」ファイルエンコーディングを変更できず、「RACS」システムはUTF-8またはUnicodeファイルへの挿入をサポートしていないことを付け加えます。どちらかの方法を試みると、システムはランダムなシンボルを挿入しますラトビア固有の文字。

他の情報が必要な場合は、今すぐお知らせください。喜んで提供します:)

どんな助けも大歓迎です。

24

CP1252はāを表すことができません。入力に同様の文字âが含まれています。 reprは、ASCII 2.xのUnicode文字列のPython表現を表示するだけです。

>>> print(repr(b'J\xe2nis'.decode('cp1252')))
u'J\xe2nis'
>>> print(b'J\xe2nis'.decode('cp1252'))
Jânis
20
phihag

おもう u'J\xe2nis'は正しい。参照:

>>> print u'J\xe2nis'.encode('utf-8')
Jânis

SQLAlchemyから実際のエラーが発生していますか、それともアプリケーションの出力にありますか?

2
djc