最近处理一个 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 此问题无解?
#!/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, 'rb')
contents = file_word_obj.read()
copy_file_word_obj = open(copy_file_path, 'wb')
copy_file_word_obj.write(contents)
file_word_obj.close()
copy_file_word_obj.close()
1
Sylv 2019-04-21 11:09:43 +08:00
docx 文件并不是纯文本文件,因此你得用二进制模式来读写:
open(file_path, 'rb') |
2
hsfzxjy 2019-04-21 11:15:59 +08:00 via Android
为什么不用 shutil.copy
|
3
zwh2698 2019-04-21 11:40:51 +08:00 via Android
#1 #2 都是正确的回答。
顺便说一下,docx 是 zip 文件。压缩的内容是 xml,至于为什么是 xml,文档格式标准,当年中国和微软之争,微软赢得标准。 |
4
brickyang 2019-04-21 12:46:04 +08:00
只是复制文件的话也不用直接操作内容。Python 操作 .docx 可以用: https://python-docx.readthedocs.io
|
5
Kylin30 2019-04-21 13:16:42 +08:00
直接复制?
|
6
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 另一片空间就是复制。 |
7
kisshere 2019-04-21 15:17:14 +08:00
你的头像违规了
|
8
wikinee OP |
10
ddzzhen 2019-04-21 20:50:55 +08:00
容易碰到的坑,mark 一下
|
11
heraldic 2019-04-22 08:22:33 +08:00
跟编码无关的,docx 等等很多新的格式,都是 zip 压缩包,得用二进制打开
|