Python3 正确打开 word 文档编码问题

2019-04-21 10:50:08 +08:00
 wikinee

最近处理一个 word 文档复制的问题,需要读写中文 word 文档。

Python2 里,可以 reload(sys) 来解决

但是 Python3 里,遇到些问题:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

file_path = "/Users/someone/Documents/WPS 更新啦.docx"
copy_file_path = "/Users/someone/Workspace/PythonTest/WPS 更新啦.docx"
file_word_obj = open(file_path, 'r', encoding='latin-1')
contents = file_word_obj.read()
copy_file_word_obj = open(copy_file_path, 'w')
copy_file_word_obj.write(contents)
file_word_obj.close()
copy_file_word_obj.close()

目前在 encoding 里,只找到 ‘ latin-1 ’ 不会报错,GBK,UTF-8 都会报错

还是 Python3 此问题无解?

3229 次点击
所在节点    Python
11 条回复
Sylv
2019-04-21 11:09:43 +08:00
docx 文件并不是纯文本文件,因此你得用二进制模式来读写:
open(file_path, 'rb')
hsfzxjy
2019-04-21 11:15:59 +08:00
为什么不用 shutil.copy
zwh2698
2019-04-21 11:40:51 +08:00
#1 #2 都是正确的回答。
顺便说一下,docx 是 zip 文件。压缩的内容是 xml,至于为什么是 xml,文档格式标准,当年中国和微软之争,微软赢得标准。
brickyang
2019-04-21 12:46:04 +08:00
只是复制文件的话也不用直接操作内容。Python 操作 .docx 可以用: https://python-docx.readthedocs.io
Kylin30
2019-04-21 13:16:42 +08:00
直接复制?
RyougiShiki
2019-04-21 14:31:42 +08:00
gbk utf-8 是文字到二进制的对应,平时叫纯文本文件,但存在硬盘上也是二进制。
jpg mp4 是图片、音频视频的编码,色彩点到二进制的对应,平时叫二进制文件。想“看到”它们的效果需要用图片查看器、视频播放器等会解各自编码的专门软件。
word 文件里的字体大小加粗等效果是一些额外规则定义的,规则和文字共同形成 word 的编码规则。utf-8 打开 word 相当于编码解码规则不一样,所以乱码。 用 utf-8 打开一个 jpg 乱码同理。

需求是读写内容的话,用 word 编码规则打开,参考 4 楼。
如果需求是只复制文件的话,把二进制取出 rb,不需要“看到”,再写入 wb 另一片空间就是复制。
kisshere
2019-04-21 15:17:14 +08:00
你的头像违规了
wikinee
2019-04-21 16:02:01 +08:00
@Sylv @zwh2698 @RyougiShiki 感谢解我困惑
@brickyang 想过,等着作为兜底方案,也不知道是不是同时支持 xlsx, pptx
wikinee
2019-04-21 16:02:28 +08:00
@kisshere 已修改(捂脸)
ddzzhen
2019-04-21 20:50:55 +08:00
容易碰到的坑,mark 一下
heraldic
2019-04-22 08:22:33 +08:00
跟编码无关的,docx 等等很多新的格式,都是 zip 压缩包,得用二进制打开

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/557191

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX