首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
V2EX  ›  Python

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

  •  
  •   wikinee · 179 天前 · 1696 次点击
    这是一个创建于 179 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近处理一个 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 条附言  ·  179 天前

    感谢诸位解我困惑,哈哈

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

    需求是读写内容的话,用 word 编码规则打开,参考 4 楼。
    如果需求是只复制文件的话,把二进制取出 rb,不需要“看到”,再写入 wb 另一片空间就是复制。
        7
    kisshere   179 天前
    你的头像违规了
        8
    wikinee   179 天前
    @Sylv @zwh2698 @RyougiShiki 感谢解我困惑
    @brickyang 想过,等着作为兜底方案,也不知道是不是同时支持 xlsx, pptx
        9
    wikinee   179 天前
    @kisshere 已修改(捂脸)
        10
    ddzzhen   179 天前
    容易碰到的坑,mark 一下
        11
    heraldic   179 天前
    跟编码无关的,docx 等等很多新的格式,都是 zip 压缩包,得用二进制打开
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4358 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 24ms · UTC 01:52 · PVG 09:52 · LAX 18:52 · JFK 21:52
    ♥ Do have faith in what you're doing.