V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
wikinee
V2EX  ›  Python

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

  •  
  •   wikinee · 2019-04-21 10:50:08 +08:00 · 3219 次点击
    这是一个创建于 1822 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近处理一个 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 此问题无解?

    第 1 条附言  ·  2019-04-21 15:57:00 +08:00

    感谢诸位解我困惑,哈哈

    #!/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()
    
    11 条回复    2019-04-22 08:22:33 +08:00
    Sylv
        1
    Sylv  
       2019-04-21 11:09:43 +08:00
    docx 文件并不是纯文本文件,因此你得用二进制模式来读写:
    open(file_path, 'rb')
    hsfzxjy
        2
    hsfzxjy  
       2019-04-21 11:15:59 +08:00 via Android
    为什么不用 shutil.copy
    zwh2698
        3
    zwh2698  
       2019-04-21 11:40:51 +08:00 via Android
    #1 #2 都是正确的回答。
    顺便说一下,docx 是 zip 文件。压缩的内容是 xml,至于为什么是 xml,文档格式标准,当年中国和微软之争,微软赢得标准。
    brickyang
        4
    brickyang  
       2019-04-21 12:46:04 +08:00
    只是复制文件的话也不用直接操作内容。Python 操作 .docx 可以用: https://python-docx.readthedocs.io
    Kylin30
        5
    Kylin30  
       2019-04-21 13:16:42 +08:00
    直接复制?
    RyougiShiki
        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 另一片空间就是复制。
    kisshere
        7
    kisshere  
       2019-04-21 15:17:14 +08:00
    你的头像违规了
    wikinee
        8
    wikinee  
    OP
       2019-04-21 16:02:01 +08:00
    @Sylv @zwh2698 @RyougiShiki 感谢解我困惑
    @brickyang 想过,等着作为兜底方案,也不知道是不是同时支持 xlsx, pptx
    wikinee
        9
    wikinee  
    OP
       2019-04-21 16:02:28 +08:00
    @kisshere 已修改(捂脸)
    ddzzhen
        10
    ddzzhen  
       2019-04-21 20:50:55 +08:00
    容易碰到的坑,mark 一下
    heraldic
        11
    heraldic  
       2019-04-22 08:22:33 +08:00
    跟编码无关的,docx 等等很多新的格式,都是 zip 压缩包,得用二进制打开
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1476 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 23:57 · PVG 07:57 · LAX 16:57 · JFK 19:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.