首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python中正确读取Windows1252(Cp1252)文件中的文本

问在python中正确读取Windows1252(Cp1252)文件中的文本
EN

Stack Overflow用户
提问于 2013-03-19 22:45:50
回答 3查看 91.4K关注 0票数 35

所以,正如标题所暗示的,我遇到的问题是用python正确读取windows-1252编码文件中的输入,并将输入插入到SQLAlchemy-MySql表中。

当前系统设置:

Windows7VM与“罗杰访问控制系统”输出的文件;

Ubuntu 12.04 LTS VM与Windows系统共享文件夹,这样我就可以使用"Python 2.7.3“访问该文件。

现在到实际问题,对于输入文件,我有一个"VM共享文件夹“,其中包含一个在Windows7系统上通过罗杰访问控制系统生成的文件(更多详细信息,请参阅roger.pl),这个文件名为"PREvents.csv”,它向它的内容建议一个";“分离的数据列表。

以下是数据格式的示例:

代码语言:javascript
复制
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。

就像我习惯的那样,我会这样打开文件:

代码语言:javascript
复制
try:
    f = codecs.open(file, 'rb', 'cp1252')
except IOError:
    f = codecs.open(file, 'wb', 'cp1252')

到目前为止,一切正常-它打开文件,所以我继续迭代文件的每一行(这是一个连续运行的脚本,所以请原谅循环):

代码语言:javascript
复制
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对象和插入/更新:

代码语言:javascript
复制
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()

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

代码语言:javascript
复制
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

这对我一点帮助都没有。

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

代码语言:javascript
复制
Instead of the character "ā" it inserts "â"

我还想补充说,我不能更改"PREvents.csv“文件编码,并且"RACS”系统不支持插入到UTF-8或Unicode文件中-如果您尝试任何一种方式,系统都会为拉脱维亚特定字符插入随机符号。

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

任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-19 22:50:12

CP1252不能表示ā;您的输入包含类似的字符?repr只是在Python2.x中显示unicode字符串的ASCII码表示:

代码语言:javascript
复制
>>> print(repr(b'J\xe2nis'.decode('cp1252')))
u'J\xe2nis'
>>> print(b'J\xe2nis'.decode('cp1252'))
Jânis
票数 26
EN

Stack Overflow用户

发布于 2013-03-19 22:51:00

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

代码语言:javascript
复制
>>> print u'J\xe2nis'.encode('utf-8')
Jânis

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

票数 3
EN

Stack Overflow用户

发布于 2019-10-08 23:21:04

我在一些XML文件中遇到了同样的问题,我解决了读取ANSI编码(Windows-1252)的文件和写入UTF-8编码的文件的问题:

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15502619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档