【问题标题】:Python3 - Cannot read docx, odt file - UnicodeDecodeError: 'utf-8' codec can't decode byte 0xea in position 10: invalid continuation bytePython3 - 无法读取 docx、odt 文件 - UnicodeDecodeError: 'utf-8' codec can't decode byte 0xea in position 10: invalid continuation byte
【发布时间】:2018-01-31 07:09:45
【问题描述】:

我正在尝试将一个大的 docx 文件拆分为小文件。为此,在 python3.6 中使用以下代码读取文件时。

with open('h.docx', 'r') as f:
    a = f.read()

它会抛出这个错误。

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "/usr/local/lib/python3.6/codecs.py", line 321, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
  UnicodeDecodeError: 'utf-8' codec can't decode byte 0xea in position 
  10: invalid continuation byte

h.docx 是使用 LibreOffice Calc 创建的,其中仅包含 'hello world' 作为内容。我可以在 Python 2.7 中成功阅读,没有任何错误。

我试过了

with open('h.docx', 'r', encoding='latin-1') as f:
    a = f.read()

在此我可以毫无错误地读取文件。但是当写入另一个文件时,原始内容会丢失。

也试过errors='surrogateescape',但是当写入另一个文件时,原始内容会丢失。

【问题讨论】:

  • 你想做什么?如果你只是想读写另一个文件,用“rb”with open('h.docx', 'rb') as f:读取它,用wb写入它
  • 我正在尝试读取一个大的 docx 文件并希望将其拆分为多个小文件。所以我想我不能在这里将文件作为二进制文件读取。
  • .docx 文件是二进制文件,因此您必须使用“rb”打开它们。此外,如果您要将整个 blob 分成几块,您将得不到任何有用的东西。 .docx 文件实际上是压缩档案。试试这个:将文件扩展名更改为 .zip 并使用存档实用程序打开它,然后您将能够看到其中的内容。文本嵌入在一些 XML 文件中。

标签: python file encoding utf-8 decode


【解决方案1】:

不是真正的答案,但评论太长了。你所做的只是无意义的:你试图读取一个“.docx”文件,就好像它是一个文本文件,它是不是。这是一种复杂的格式,其中几个 xml 文件(可能还有其他......)被连接到一个 zip 文件中。您甚至不应该考虑手动处理这样的文件,除非:

  • 琐碎的更改,例如用另一个词替换一个词
  • 只读操作,例如研究特定字符串
  • 你想写一个 docx 处理包(祝你好运)

甚至那些也不是简单的操作。

什么是可能的:

  • 当您仅将文件视为不透明内容时将其作为二进制文件处理,例如通过网络连接发送文件
  • 使用像python-docx这样的专用库
  • 在Windows下,使用Word的自动化界面让word自己处理文件(comtypes可以帮忙)

【讨论】:

  • 快速问题:为什么我可以在 Python2.7 中而不是在 Python3.6 中做同样的事情?我可以在python2.7中读取docx文件而没有任何错误。
  • Python 2 字符串只是字节字符串,这意味着在 Python 2 中读取文本文件时不会出现 unicode 解码错误,因为不涉及 unicode 解码操作。但是您很可能会得到无法使用的垃圾,因为在处理 '\x1D'(回车)字符的 null 时仍然可能会遇到问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 2020-03-01
  • 2014-05-14
  • 1970-01-01
  • 2020-12-26
  • 2021-11-24
相关资源
最近更新 更多