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
相关产品推荐
相关产品推荐

