36

タイトルが示唆しているように、私が抱えている問題は、Pythonでwindows-1252でエンコードされたファイルから入力を正しく読み取り、その入力をSQLAlchemy-MySqlテーブルに挿入することです。

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

実際の問題として、入力ファイルとして、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 つのフィールドのいずれかにラトビア語固有の文字が含まれる可能性があるという事実に起因します。例のファイルでは、「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'、「\xe2\」はラトビア文字の「ā」を表していません。
イベントの種類に応じて、ループをさらに下って、変数を 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 ファイルへの挿入をサポートしていないことも付け加えたいと思います。ラトビア固有の文字。

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

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

4

3 に答える 3

27

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

>>> print(repr(b'J\xe2nis'.decode('cp1252')))
u'J\xe2nis'
>>> print(b'J\xe2nis'.decode('cp1252'))
Jânis
于 2013-03-19T14:50:12.177 に答える
3

u'J\xe2nis'は正しいと思います、参照してください:

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

SQLAlchemy またはアプリケーションの出力から実際のエラーが発生していますか?

于 2013-03-19T14:50:59.960 に答える