吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 880|回复: 10
收起左侧

[求助] 一段python代码,求大神帮忙调试下错误

[复制链接]
weijizheng 发表于 2023-3-7 16:03
本帖最后由 侃遍天下无二人 于 2023-3-7 17:14 编辑

[Python] 纯文本查看 复制代码
import os
import comtypes.client

# 指定要转换的文件类型
EXTENSIONS = ['.doc', '.docx', '.xls', '.xlsx']

# 定义转换失败的文件列表
failed_files = []

# 定义转换函数
def convert_to_pdf(filename):
    try:
        # 获取文件名和扩展名
        name, ext = os.path.splitext(filename)

        # 判断文件类型是否在指定的扩展名列表中
        if ext in EXTENSIONS:
            # 创建转换器
            pdf_format_key = "Word.Application" if ext in [".doc", ".docx"] else "Excel.Application"
            pdf_format = comtypes.client.CreateObject(pdf_format_key)

            # 打开文件
            doc = pdf_format.Documents.Open(os.path.abspath(filename))

            # 保存为PDF格式
            new_name = name + '.pdf'
            doc.SaveAs(os.path.abspath(new_name), FileFormat=17)

            # 关闭文件
            doc.Close()

    except Exception as e:
        # 记录转换失败的文件
        failed_files.append(filename)
        print(f"转换失败: {filename},错误信息: {e}")


# 定义处理文件夹函数
def process_folder(folder):
    for root, dirs, files in os.walk(folder):
        for filename in files:
            # 转换文件
            convert_to_pdf(os.path.join(root, filename))

# 定义主函数
if __name__ == '__main__':
    # 指定要处理的文件夹
    folder = r'E:\temp'

    # 处理文件夹中的所有子文件夹
    process_folder(folder)

    # 输出转换失败的文件列表
    if failed_files:
        print('以下文件转换失败:')
        for filename in failed_files:
            print(filename)
    else:
        print('所有文件已成功转换为 PDF 文件')



报错:转换失败: E:\temp\2023年2月份未发放工资明细表 .xlsx,错误信息: Documents

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

侃遍天下无二人 发表于 2023-3-7 17:16
报错信息就一个 Documents吗,这样啥也看不出来,你把要处理的数据简化脱敏后上传到蓝奏云上再看有没有人能找到原因
GhG 发表于 2023-3-7 17:25
本帖最后由 GhG 于 2023-3-7 17:27 编辑

[Python] 纯文本查看 复制代码
def convert_to_pdf(filename):
    try:
        # 获取文件名和扩展名
        name, ext = os.path.splitext(filename)

        # 判断文件类型是否在指定的扩展名列表中
        if ext in EXTENSIONS:
            # 创建转换器
            pdf_format_key = "Word.Application" if ext in [".doc", ".docx"] else "Excel.Application"
            pdf_format = comtypes.client.CreateObject(pdf_format_key)

            # 打开文件
            doc = pdf_format.Documents.Open(filename)

            # 保存为PDF格式
            new_name = name + '.pdf' if ext in [".doc", ".docx"] else name
            doc.SaveAs(os.path.abspath(new_name), FileFormat=17)

            # 关闭文件
            doc.Close()

    except Exception as e:
        # 记录转换失败的文件
        failed_files.append(filename)
        print(f"转换失败: {filename},错误信息: {e}")

免费评分

参与人数 1吾爱币 -4 收起 理由
侃遍天下无二人 -4 请勿灌水,提高回帖质量是每位会员应尽的义务!

查看全部评分

psvajaz 发表于 2023-3-7 18:02
先检查以下开启的文件路径和保存的文件路径是否正确,如果插件没有问题和用法正确,大多问题出现在open和save的文件路径上,先调试或print看看filename,new_name,os.path.abspath(filename),os.path.abspath(new_name)的值看看是否正确
 楼主| weijizheng 发表于 2023-3-7 18:05
psvajaz 发表于 2023-3-7 18:02
先检查以下开启的文件路径和保存的文件路径是否正确,如果插件没有问题和用法正确,大多问题出现在open和sa ...

谢谢你的回复,我试试看
psvajaz 发表于 2023-3-7 18:08
weijizheng 发表于 2023-3-7 18:05
谢谢你的回复,我试试看

调试成功后回复以下,我没有安装comtypes.client这个插件
ciker_li 发表于 2023-3-7 18:11
doc = pdf_format.Documents.Open(os.path.abspath(filename))
这个是word文档打开的格式
excel用doc = pdf_format.Workbooks.Open(os.path.abspath(filename)).
 楼主| weijizheng 发表于 2023-3-7 18:22
ciker_li 发表于 2023-3-7 18:11
doc = pdf_format.Documents.Open(os.path.abspath(filename))
这个是word文档打开的格式
excel用doc = p ...

非常感谢,我试试看
头像被屏蔽
洛枫 发表于 2023-3-7 19:37
提示: 作者被禁止或删除 内容自动屏蔽
QQending 发表于 2023-3-10 16:30
import os
import comtypes.client

# The comtypes package — comtypes 1.1.3 documentation
# https://pythonhosted.org/comtypes/#accessing-properties

# 指定要转换的文件类型
EXTENSIONS = ['.doc', '.docx', '.xls', '.xlsx']

# 定义转换失败的文件列表
failed_files = []

# 定义转换函数
def convert_to_pdf(fp):
    try:
        # 从待转换文件的路径,你才可以获取文件名(包括拓展名的文件名)
        filename = os.path.basename(fp)
        # 获取文件名和扩展名
        name, ext = os.path.splitext(filename)
        # 先预设打开文件对象为None,如果文件成功打开,就不会是None了
        file = None
        # 判断文件类型是否在指定的扩展名列表中
        if ext in EXTENSIONS:
            # 创建转换器
            pdf_format_key = "Word.Application" if ext in [".doc", ".docx"] else "Excel.Application"
            converter = comtypes.client.CreateObject(pdf_format_key)
            # 保存为PDF格式
            new_name = name + '.pdf' 

            # 判定文件类型
            if pdf_format_key == "Word.Application":
            # 打开文件
                file = converter.Documents.Open(os.path.abspath(fp))
                file.SaveAs(os.path.abspath(new_name), FileFormat=17)
            elif pdf_format_key == "Excel.Application":
                # https://www.cnpython.com/qa/373468
                file = converter.Workbooks.Open(os.path.abspath(fp))
                file.ExportAsFixedFormat(0, new_name, 1, 0)

    except Exception as e:
        # 记录转换失败的文件
        failed_files.append(filename)
        print(f"转换失败: {filename},错误信息: {e}")
    finally:
         # 关闭文件
        if file is not None:
            file.Close()

# 定义处理文件夹函数
def process_folder(folder):
    for dirpath, dirnames, files in os.walk(folder):
        for filename in files:
            # 转换文件,你这里传入的是路径
            convert_to_pdf(os.path.join(dirpath, filename))

# 定义主函数
if __name__ == '__main__':
    # 指定要处理的文件夹
    folder = r'E:\temp'

    # 处理文件夹中的所有子文件夹
    process_folder(folder)

    # 输出转换失败的文件列表
    if failed_files:
        print('以下文件转换失败:')
        for filename in failed_files:
            print(filename)
    else:
        print('所有文件已成功转换为 PDF 文件')
  • 我大致改了改,也没跑这段代码
  • 我最近是用pathlib而非os.path来处理路径
  • 你给convert_to_pdf传的肯定是文件路径,而不仅仅是文件名
    • 在函数里需要重新获取下文件名,比如用 os.path.basename
  • 另外,也有其他人提到的,打开word和打开excel用的API是不一样的,比如Workbooks.Open和Documents.Open
  • 因为我之前转pdf用的都是pywin32,所以我记得导出的时候FileFormat的值也不同
  • 然后我搜了一下 comtyps excel 转 pdf,发现有一篇文章提到用的是 ExportAsFixedFormat。
  • 我建议你导出的时候也指定一下导出文件夹。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 02:30

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表