You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现docx转zip时报TypeError: expected str类对象而非TextIOWrapper

问题原因

  • os.path.splitext() 要求输入参数为文件路径字符串,但你传入的selected_file是open(fn)返回的文件对象,类型不匹配是IDE报错的直接原因。
  • 你当前的代码逻辑不符合docx转zip的需求:docx本身就是标准ZIP格式压缩包,不需要重新创建zip文件写入内容,直接修改文件后缀即可实现格式转换。
  • 现有末尾的with open()语句语法错误,缺少结尾冒号、缺少文件操作模式参数,且不需要用open()处理格式转换逻辑。

修复后代码(直接改后缀实现转换)

import os
import tkinter as tk
from tkinter.filedialog import askopenfilename

tk.Tk().withdraw()
# 选择docx文件
fn = askopenfilename(initialdir='/Desktop', title='Select a file', filetypes=(('docx file', '*.docx'), ('All files', '*.*')))
if not fn: # 处理用户取消选择的情况
    exit()
# 生成新的zip文件名
new_file_name = os.path.splitext(fn)[0] + '.zip'
# 重命名文件 直接改后缀完成转换
os.rename(fn, new_file_name)
print(f"转换完成,文件已保存为:{new_file_name}")

扩展:如果需要解压docx内的文件内容

如果你是要读取docx内部的xml等资源,不需要改后缀,直接用zipfile读取原docx文件即可:

import zipfile
import os
import tkinter as tk
from tkinter.filedialog import askopenfilename

tk.Tk().withdraw()
fn = askopenfilename(initialdir='/Desktop', title='Select a file', filetypes=(('docx file', '*.docx'), ('All files', '*.*')))
if not fn:
    exit()
# 直接读取docx作为zip文件
with zipfile.ZipFile(fn, 'r') as zip_ref:
    # 解压到和原文件同名的文件夹
    extract_path = os.path.splitext(fn)[0]
    zip_ref.extractall(extract_path)
print(f"解压完成,文件已提取到:{extract_path}")

内容的提问来源于stack exchange,提问作者ersteroderletzter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 10:15:01