在Python中正确读取Windows-1252(cp1252)文件中的文本

12 浏览
0 Comments

在Python中正确读取Windows-1252(cp1252)文件中的文本

问题是在Python中正确读取来自windows-1252编码文件的输入,并将该输入插入到SQLAlchemy-MySQL表中。当前的系统设置如下:

Windows 7虚拟机上有一个名为"Roger Access Control System"的系统,该系统输出文件;

Ubuntu 12.04 LTS虚拟机上有一个与Windows系统共享文件夹,以便我可以访问文件,使用的是"Python 2.7.3"。

现在是实际问题,对于输入文件,我有一个"虚拟机共享文件夹",其中包含一个在Windows 7系统上通过Roger Access Control System(有关详细信息,请参见roger.pl)生成的文件,该文件称为"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:
        # 暂停循环1秒钟
        time.sleep(1)
    else:
        # 将行拆分为列表
        date, timed, userid, firstname, lastname, groupid, groupname, typed, pointname, empty = line.split(';')

问题就从这里开始,如果我print repr(firstname),它输出u'J\xe2nis',据我了解,这是不正确的 - `\xe2\`不代表拉脱维亚字符"ā"。

在循环的后面,根据事件类型,我将变量赋值给SQLAlchemy对象并进行插入/更新:

if typed == '0':  # 输入类型
    event = Events(
        period,
        fullname,
        userid,
        groupname,
        timestamp,
        0,
        0
    )
    session.add(event)
else:  # 输出类型
    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
# 提交更改到数据库
session.commit()

在寻找答案的过程中,我发现了如何定义要使用的默认编码:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

但这没有对我有任何帮助。

基本上,这导致我无法插入正确的所有者的名字/姓氏,以及所有者分配的组名,如果它们包含任何拉脱维亚特定字符,例如:

它插入"â"而不是字符"ā"

我还想补充一点,我无法更改"PREvents.csv"文件的编码,"RACS"系统不支持向UTF-8或Unicode文件插入 - 如果您尝试任何一种方式,系统会插入拉脱维亚特定字符的随机符号。

如果需要其他信息,请告诉我,我会乐意提供 🙂

非常感谢任何帮助。

0