当前位置: 首页 > 知识库问答 >
问题:

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

裴威
2023-03-14

好的,正如标题所示,我的问题是正确地从python中的windows-1252编码文件中读取输入,并将所述输入插入SQLAlchemy MySql表。

当前系统设置:
Windows 7虚拟机,带“罗杰访问控制系统”,输出文件
Ubuntu12.04 LTS虚拟机,带有Windows系统的共享文件夹,因此我可以使用“Python 2.7.3”访问该文件。

现在来看实际问题,对于输入文件,我有一个“VM共享文件夹”,其中包含一个在Windows 7系统上通过Roger访问控制系统生成的文件(更多详细信息,请参见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;

第四个字段包含卡所有者姓名,第五个字段包含所有者姓氏,第六个字段包含所有者分配的组。

问题的根源在于上述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(';')

这就是问题的开始,如果我打印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')

这对我没有任何帮助。

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

Instead of the character "ā" it inserts "â"

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

如果需要任何其他信息,请立即告知我,我很乐意提供:)

任何帮助都将不胜感激。

共有3个答案

邢焕
2023-03-14

我对一些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()
翟功
2023-03-14

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

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

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

郎弘壮
2023-03-14

CP1252不能代表ā;您的输入包含类似的字符–0repr仅显示Python 2中unicode字符串的ASCII表示形式。x:

>>> print(repr(b'J\xe2nis'.decode('cp1252')))
u'J\xe2nis'
>>> print(b'J\xe2nis'.decode('cp1252'))
Jânis
 类似资料:
  • 我理解下面的代码可以正常工作。在阅读Python中的while循环文档时,他们说while表达式应该是True或False,这很有意义。 现在,函数返回字符串。那么这个while循环是如何工作的呢?

  • 问题内容: 使用GoogleAppEngine(Go)读取文件的正确方法是什么? 在Java中,我读到了,是否有等效的功能? 问题答案: 您可以从App Engine上的文件中读取文件,也可以从计算机上运行的Go应用程序中的文件中读取文件。 注意事项: 您应该使用 相对 文件路径,而不是绝对路径。工作目录是应用程序的根文件夹(文件所在的位置)。 Go代码只能读取属于 应用程序 文件的文件,因此,如

  • 我正在尝试将我们的数据库从latin1转换为UTF-8。不幸的是,我不能做一个大规模的单一切换,因为应用程序需要保持在线,我们有700GB的数据库要转换。 因此,我试图利用mysql的一些技巧,将表转换为UTF-8,而不是数据。我希望数据能够被实时读取、转换和替换。(如果愿意,可以进行JIT转换) 我们的php应用程序目前使用所有默认值,所以它使用latin1字符集连接到mysql,并丢弃在lat

  • 问题内容: 是否可以用Python读取二进制MATLAB .mat文件? 我已经看到SciPy声称支持读取.mat文件,但是我没有成功。我安装了SciPy 0.7.0版,但找不到该方法。 问题答案: 需要导入,…

  • 我有以下代码来读取java文件,并打印出行。我通过两种方式实现了它: 使用流: 使用循环: 我被告知这是错误的,使用缓冲读取器是错误地使用了语言的特性。有没有更好的方法,我想知道使用语言功能的正确方法。

  • 问题内容: 对此有很多问题,但是对于如何将xlsb文件读入熊猫还没有简单的答案。是否有捷径可寻? 问题答案: 随着pandas-的发布,增加了对二进制Excel文件的支持。 笔记: 您将需要升级熊猫- 您将需要安装-