【问题标题】:Python 2.7: reload(sys) disables error messages and print in WindowsPython 2.7:reload(sys) 禁用错误消息并在 Windows 中打印
【发布时间】:2012-11-03 14:40:05
【问题描述】:

我正在制作一个脚本,要求我将编码格式更改为“UTF-8”。我在 Stachoverflow 上找到了一个主题说我可以使用:

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

它在 OSX 10.8(可能更早的版本)中运行良好,但在 Windows XP 和 Windows 7(也可能是 Vista 和 8)中,它会禁用解释器中的所有反馈。 脚本仍在运行,但我无法打印任何内容或查看是否有任何问题。

有没有办法修补当前代码,或者是否有其他方法可以更改编码?

【问题讨论】:

  • “禁用所有反馈”到底是什么意思?
  • 可能是因为cmd.exe默认不使用utf-8?
  • 对我来说效果很好
  • According to the Python developers,文学硕士。 Lemburg 和 Martin 诉 Löwis,更改 setdefaultencoding 不是解决任何问题的受支持方式。它会使您的 Python 脚本与大多数其他 Python 用户不兼容,并可能导致意外行为或 moji-bake。
  • 没有简单的选择。 Python3 将迫使程序员更加关注bytes(即Python2 中的strs)和str(或Python2 中所谓的unicode)。 Python3 不会使用ascii 编码在两者之间进行隐式转换,而是通常会引发异常。因此,从长远来看,了解the absolute minimum needed to deal with unicode 以及对how to deal with unicode in Python 的一些实用建议会有所回报。

标签: python printing utf-8 sys


【解决方案1】:

可能发生在你身上的事情与空闲有关,因为空闲替换了默认的 sys.stdin、sys.stdout、sys.stderr 与它自己的对象。 reload(sys)后,与sys关联的三个文件对象会恢复为默认的,空闲时看不到。

你可以在 reload(sys) 后改回来解决这个问题:

import sys
stdin, stdout, stderr = sys.stdin, sys.stdout, sys.stderr
reload(sys)
sys.stdin, sys.stdout, sys.stderr = stdin, stdout, stderr

【讨论】:

  • 谢谢!这个 hack 确实解决了我另一个问题,即当测试代码正在执行重新加载(sys)时,标准流捕获(capsys)在 pytest 中被破坏。通过确保我们在重新加载时保持流,这个问题得到了排序。
【解决方案2】:

坦率地说,我不知道为什么您可能想要更改 Python 的默认编码只是为了读取和解析单个文件(或者甚至是大量文件)。 Python 可以很容易地解析和处理 UTF-8,而无需采取如此严厉的措施。此外,在这个网站上,有一些很棒的方法可以做到这一点。这个问题接近于重复:Unicode (UTF-8) reading and writing to files in Python

在那一行,最好的答案是:https://stackoverflow.com/a/844443/678533,它基本上依赖于 Python 的Codecs 模块。

使用这种方法,您可以执行以下操作:

import codecs
with codecs.open("SomeFile", "rb", "utf-8") as inFile: 
    text = inFile.read()
# Do something with 'text' here
with codecs.open("DifferentFile", "wb", "utf-8") as outFile:
    outFile.write(text)

这会成功读取 UTF-8 格式的文件,然后将其写回为 UTF-8。变量 'text' 将是 Python 中的 unicode 字符串。您始终可以将其写回为 UTF-8 或 UTF-16 或任何兼容的输出格式。

【讨论】:

    猜你喜欢
    • 2012-07-25
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 2016-05-11
    • 2018-09-11
    • 1970-01-01
    相关资源
    最近更新 更多