【问题标题】:UnicodeEncodeError in python3 when redirection is used使用重定向时python3中的UnicodeEncodeError
【发布时间】:2020-01-17 00:14:29
【问题描述】:

我想要做的:从 pdf 文件中提取文本信息并将其重定向到 txt 文件。

我做了什么:

pip install pdfminor

pdf2txt.py file.pdf > output.txt

我得到了什么:

UnicodeEncodeError: 'gbk' codec can't encoding character '\u2022' in position 0: 非法多字节序列

我的观察:

\u2022 是要点,

pdf2txt.py 无需重定向即可正常工作:项目符号字符被写入标准输出而没有任何错误。

我的问题:

为什么重定向会导致 python 错误?据我所知,重定向是一个操作系统。工作,它只是在程序完成后复制东西。

如何解决此错误?我无法对pdf2txt.py 进行任何修改,因为它不是我的代码。

【问题讨论】:

  • Python 需要知道输出使用什么编码。它可以根据输出到终端还是文件来选择不同的编码。
  • 好的,谢谢马克,有什么解决方法的建议吗?
  • 我认为有一个环境变量会影响它,但我现在没有时间查找它。
  • 没关系,我可以等其他人帮我。非常感谢您回答我。
  • 通常 Python 在发送到终端之前获取终端使用的编码来对文本进行编码,但是当您重定向时,它无法从终端获取编码 - 您必须在 python 脚本中手动设置编码 - 可能在每个print()

标签: python decode encode io-redirection


【解决方案1】:

重定向会导致错误,因为 Python 使用的默认编码不支持您尝试输出的字符之一。在您的情况下,您尝试使用GBK codec 输出bullet character 。这可能意味着您使用的是中文版的 Windows。

Python 3.6 或更高版本可以正常输出到 Windows 上的终端窗口,因为使用 Unicode 完全绕过了字符编码。仅当将输出重定向到文件时,Unicode 必须编码为字节流。

您可以设置环境变量PYTHONIOENCODING 来更改用于stdio 的编码。如果您使用 UTF-8,它将保证适用于任何 Unicode 字符。

set PYTHONIOENCODING=utf-8
pdf2txt.py file.pdf > output.txt

【讨论】:

  • 是的,没错,我用的是中文版windows。您的建议非常适合我,非常感谢。
【解决方案2】:

您似乎以某种方式从原始字节中获得了 unicode 字符,但您需要对其进行编码。我建议您对 txt 文件使用 UTF-8 编码。

使编码参数更明确可能是您想要的。

def gbk_to_utf8(source, target):
    with open(source, "r", encoding="gbk") as src: 
        with open(target, "w", encoding="utf-8") as dst: 
            for line in src.readlines():
                dst.write(line)

【讨论】:

  • 谢谢,但正如我所说,我无法修改那个 python 文件...
  • @NevilleZong 根据您直接运行 Python 源代码的问题。不确定是什么阻止您复制 pdf2txt.py 并对其进行更改。
猜你喜欢
  • 2017-02-28
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 2021-12-17
  • 2017-12-08
  • 1970-01-01
  • 2019-12-24
  • 1970-01-01
相关资源
最近更新 更多