正确地从python中的Windows-1252(cp1252)文件中读取文本

时间:2013-03-19 14:45:50

标签: python utf-8 python-unicode windows-1252 cp1252

好吧,因为标题表明我遇到的问题是在python中正确读取来自windows-1252编码文件的输入并将所述输入插入到SQLAlchemy-MySql表中。

当前的系统设置:
带有“Roger访问控制系统”的Windows 7 VM输出文件;
Ubuntu 12.04 LTS VM带有Windows系统的共享文件夹,因此我可以使用“Python 2.7.3”访问该文件。

现在对于实际问题,对于输入文件,我有一个“VM共享文件夹”,其中包含一个通过Roger访问控制系统(roger.pl获取更多详细信息)在Windows 7系统上生成的文件,此文件被称为“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文件 - 如果您尝试任何一种方式,系统会随机插入拉脱维亚特有字符的符号。

如果需要任何其他信息,请现在就告诉我,我很乐意提供:)

任何帮助都将受到高度赞赏。

3 个答案:

答案 0 :(得分:16)

CP1252不能代表ā;你的输入包含类似的字符â。 repr只显示Python 2.x中的unicode字符串的ASCII表示:

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

答案 1 :(得分:2)

我认为u'J\xe2nis'是正确的,请参阅:

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

您是从SQLAlchemy或应用程序的输出中获得实际错误吗?

答案 2 :(得分:0)

我在处理某些XML文件时遇到了同样的问题,我解决了使用ANSI编码(Windows-1252)读取文件并使用UTF-8编码写入文件的问题:

import os
import sys

path = os.path.dirname(__file__)

file_name = 'my_input_file.xml'

if __name__ == "__main__":
    with open(os.path.join(path, './' + file_name), 'r', encoding='cp1252') as f1:
        lines = f1.read()
        f2 = open(os.path.join(path, './' + 'my_output_file.xml'), 'w', encoding='utf-8')
        f2.write(lines)
        f2.close()
相关问题