【问题标题】:wrong encoding csv file generated by a py2exe scriptpy2exe 脚本生成的错误编码 csv 文件
【发布时间】:2014-06-24 14:36:36
【问题描述】:

我在 Python 3 中编写了一个脚本,该脚本生成了一个 CSV 文件,它可以从控制台或 Pycharm IDE 运行 .py 文件。输出文件的编码是正确的。我的语言环境设置是:

>>> locale.getpreferredencoding()
'cp1252'

然后我在 Win 7 中用 Py2exe 将它打包到一个可执行文件中。它可以工作,但是输出的 CSV 文件的编码不正确,它是用 UTF-8 编码的,并且像 á é í ó ú ñ 这样的字符无法正确显示在 Excel 中。

代码

with open('temp_gesfincas.csv', newline='') as infh, \
        open('output_gesfincas.csv', 'w', encoding='cp1252', newline='') as outfh:
    reader = csv.reader(infh, delimiter=';')
    writer = csv.DictWriter(outfh, fields, dialect='spanish')
    writer.writeheader()
    row = {}
    for linea in reader:
        print(linea)
        key = linea[0]
        try:    
            value = linea[1]
        except IndexError:
            value = ''
            continue
        if key in row:
            writer.writerow(row)
            row = {}
        row[key] = value
    if row:
        writer.writerow(row)

【问题讨论】:

  • 你用记事本++检查过文件吗?也许您找不到这些字符的原因是 Excel 的错误?我以前遇到过这种情况。使用 Notepad++ 的 hex 插件检查文件中的字节。
  • 你能给我们看看实际的代码吗?你是怎么打开文件的? open() 使用系统默认编码,除非您指定不同的编解码器。您是否还可以显示文件中生成的实际输出(最好将其打开为二进制文件,然后向我们显示有问题的行的repr())。
  • "spanish" 不是 dialect 的有效参数。
  • @Alpay 是的,我已经用 Notepad++ 检查了文件。单词“Código”的 Hex 插件的输出是:43 c3 b3 64 69 67 6f。 @MartijnPieters 显示以二进制打开的 repr() 的输出:b'C\xc3\xb3digo;Nombre;Direcci\xc3\xb3n;Poblaci\xc3\xb3n'
  • @BurhanKhalid 是的,但我已经注册:csv.register_dialect('spanish', delimiter=';') 以便使用带有 ';' 的 DictWriter分隔符。

标签: python csv python-3.x character-encoding py2exe


【解决方案1】:

我不确定py2exe 支持哪些编码,但为了正确支持Unicode 字符,编码包需要包含在.exe 中。

要包含此选项,请添加选项--packages encodings

【讨论】:

  • py2exe默认包含所有的编码包,其实de.exe打包的库中有/encodings/cp1251.pyc,其他的所有编码文件都是.pyc。我怀疑这与访问区域设置的问题有关。
  • 是的,我知道这不再需要了。我发现这篇文章可能很有趣py2exe.org/index.cgi/EvenMoreEncodings?
  • 我尝试了py2exe.org/index.cgi/EvenMoreEncodings给出的解决方案?但它对我不起作用。
  • 也许值得尝试不同的编码?
【解决方案2】:

解决了!

首先,我将脚本的 de encoding 设置为# -*- coding: cp1252 -*-。生成的字符发生了变化,但也是错误的。

自从我阅读了这个https://groups.google.com/forum/#!topic/pythonhispano/gV3kvSJY75k 之后,我已经更改了特殊注释行:

 # -*- coding: cp1252 -*-

通过另一行:

# -*- coding: 850 -*-

为什么?回答我自己:

而 Windows 使用 cp1252 编码,如下所示:

>>> locale.getpreferredencoding()
'cp1252'

windows cmd 的控制台使用 cp850,如您所见:

C:\Users\Trimax\Dev\Tests>chcp
Active code page: 850

好吧,在必须用于“编译”的 setup.py 脚本中,您可以使用脚本的文件名设置控制台或 windows 参数,具体取决于您的用途(控制台程序或 GUI 程序)。如果在 setup.py 文件中指定了“console”,则使用的编码为 850,因此您必须将脚本的编码设置为 # -*- coding: 850 -*-

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2010-09-30
    • 2014-04-10
    • 1970-01-01
    相关资源
    最近更新 更多