Python自动化小技巧20——python代码自动另存为文件

news2024/11/17 14:34:37

案例背景

我在使用openpyxl写入excel的公式的时候,我发现直接wb.save()存下来后,再进行读取的话,公式格子都是空值,需要手动另存为才会算出数值来...这太麻烦了,我写个周报算数据就是为了用代码自动化...还要手动另存为太不智能了。使用我们可以用代码进行另存为。

主要依靠这个包pywin32。下面是gpt对它的介绍:

pywin32 是一个 Python 库,用于与 Windows 操作系统进行交互和操作。通过这个库,你可以编写 Python 脚本来控制和自动化许多 Windows 应用程序和服务,包括与操作系统底层的交互。

以下是一些 pywin32 常用的功能:

  1. 与 Windows 应用程序交互:可以自动化与 Office 应用程序(如 Excel、Word 和 Outlook)的交互,自动填充表格、创建文档等。
  2. 访问 Windows API:可以直接访问和调用 Windows API,实现深入操作系统的各种功能。
  3. 操作 Windows 服务:可以启动、停止、暂停和恢复 Windows 服务,以及创建和管理服务。
  4. 访问 Windows 注册表:可以读取和修改 Windows 注册表,用于配置系统和应用程序设置。
  5. 与 COM 对象交互:可以与 Windows 的 Component Object Model (COM) 对象交互,实现更深层次的系统控制和自动化。

通过这些功能,你可以自动化许多日常办公任务,如生成报告、填充表格、批量处理文档等。此外,你还可以与 Windows 操作系统更深层次地交互,执行自定义任务和配置。

请注意,与系统底层交互时,要谨慎操作,避免不必要的错误和系统不稳定。在使用这些功能时,最好在受控环境中进行测试。

 


 

代码实现

到导入包:

import re,os
import openpyxl
import win32com.client
import shutil

在我自动化写入公式,保存了我的excel表后

wb.save('./周报/已开发票数据.xlsx')

我使用pywin32读取,然后传入一个一模一样的路径

# 打开 Excel 应用程序
excel = win32com.client.Dispatch("Excel.Application")
excel.Visible = False  # 设置 Excel 为不可见
print(input_path:=os.path.abspath('./周报/已开发票数据.xlsx'))

  

workbook = excel.Workbooks.Open(input_path)
output_path=os.path.abspath('./周报/已开发票数据.xlsx')
workbook.SaveAs(output_path)
workbook.Close()
excel.Quit()

这样就另存为成功啦!

若是word的另存为,那么需要进行win32com.client.Dispatch("Excel.Application")替换为win32com.client.Dispatch("Word.Application"),然后再去操作。

(ps,这个库读取文件不支持相对路径.....但是我又不喜欢打绝对路径(太长了),所以我都用os变成了绝对路径然后再读取和保存的)


通用脚本

这种另存为的通用功能肯定要写个小脚本:
 

import win32com.client
import shutil
import os


input_path = input("请输入要另存为的 Excel 文件路径:")
output_path = input("请输入输出文件的路径:")
temp_path = os.path.abspath("temp.xlsx")

paths=[input_path,output_path,temp_path]
input_path,output_path,temp_path=[os.path.abspath(path) for path in paths]


# 打开 Excel 应用程序
excel = win32com.client.Dispatch("Excel.Application")
excel.Visible = False  # 设置 Excel 为不可见
workbook = excel.Workbooks.Open(input_path)

    # 如果输入路径和输出路径相同,先另存为到临时文件
if os.path.abspath(input_path) == os.path.abspath(output_path):
    workbook.SaveAs(temp_path)
else:
    workbook.SaveAs(output_path)

print("文件另存为成功!")

# 关闭 Excel
workbook.Close()
excel.Quit()

# 如果输入路径和输出路径相同,覆盖原文件
if os.path.abspath(input_path) == os.path.abspath(output_path):
    shutil.move(temp_path, input_path)

我们想对源文件进行另存为然后覆盖,就把输入路径和输出路径都写一样就行,相对路径就行。

或者存不一样的位置可以这样写:

当然,上面的路径也可以写相对路径,存在不同的位置要写绝对路径。 


文件复制

前面的示例是专门针对 Excel 文件的。如果想创建一个通用的文件另存为脚本,可以使用 Python 的文件操作,不必依赖特定的库(如 pywin32)。这种方法适用于所有文件类型,包括 Excel、Word、PowerPoint、文本文件、CSV 等。

上面是另存为excel表的函数,当然,只是想要一模一样的文件,复制就行,下面是通用的文件复制代码:

import shutil

# 获取输入文件路径
input_path = input("请输入要另存为的文件路径:")

# 获取输出文件路径
output_path = input("请输入输出文件的路径:")

# 检查文件是否存在
if not os.path.exists(input_path):
    print("输入文件不存在,请检查路径!")
else:
    try:
        # 使用 shutil.copy2 可以保留原始文件的元数据
        shutil.copy2(input_path, output_path)
        print("文件另存为成功!")
    except Exception as e:
        print(f"发生错误:{e}")

这个脚本使用 shutil.copy2 函数复制文件,并保留原始文件的元数据(例如修改时间)。这个方法适用于所有文件类型,并且不依赖特定的文件格式。

只需运行此脚本,然后按照提示输入要另存为的文件路径和输出文件的路径即可。它会将输入文件复制到指定的输出路径,适用于所有常见的文件类型。


下面是gpt对于两张方法的总结和对比:

使用 shutil.copy2 方法和 win32com.client 方法另存为文件之间的主要区别在于处理文件的方式和适用范围。

1. 适用范围

  • shutil.copy2:这个方法是通用的文件复制操作,适用于所有文件类型。它不关心文件的内容或格式,只是简单地将文件从一个位置复制到另一个位置。
  • win32com.client:这个方法是通过 Windows COM 接口与特定应用程序(如 Excel、Word 等)交互。它可以处理特定文件类型的特殊特性,例如 Excel 公式、Word 样式等。

2. 文件内容处理

  • shutil.copy2:此方法不会更改文件内容。它将原始文件的所有内容和元数据(如修改时间)复制到新位置。
  • win32com.client:当与 Office 应用程序交互时,此方法可以处理文件的特殊特性。例如,当另存为 Excel 文件时,可以选择保存格式、处理公式等。

3. 依赖关系

  • shutil.copy2:不依赖特定的操作系统或应用程序。只需标准的 Python 库即可。
  • win32com.client:依赖于 Windows 操作系统和特定的应用程序(如 Excel、Word)。必须在安装了这些应用程序的 Windows 计算机上运行。

总结

  • 如果你只需要简单地复制文件,并不关心文件的特殊内容或特性,shutil.copy2 是一个通用且简单的解决方案。
  • 如果你需要处理特定文件类型的特殊特性(如 Excel 的公式计算),并且确保文件在特定应用程序(如 Excel)中的兼容性,那么 win32com.client 方法可能更合适。

通常情况下,对于一般的文件复制或另存为操作,shutil.copy2 方法应该就足够了。对于特定的 Office 文件操作,使用 win32com.client 可能会提供更多控制和灵活性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/906496.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

「Paraverse平行云」助力数字栩生突破超写实数字人“千言”的实时交互挑战

“超写实数字人”一直是图形学界的圣杯之一,力求在虚拟世界中创造出逼真无比的3D人类角色,并使其能够实时与用户进行互动,营造身临其境的虚拟体验,超写实手语主持人“千言”便是“超写实数字人”领域的佼佼者。 “千言”由数字栩…

2337. 移动片段得到字符串

给你两个字符串 start 和 target ,长度均为 n 。每个字符串 仅 由字符 L、R 和 _ 组成,其中: 字符 L 和 R 表示片段,其中片段 L 只有在其左侧直接存在一个 空位 时才能向 左 移动,而片段 R 只有在其右侧直接存在一个 …

Linux内核学习(四)—— 系统调用(基于Linux 2.6内核)

在现代操作系统中,内核提供了用户进程与内核进行交互的一组接口,这些接口在应用程序和内核之间扮演了使者的角色。这些接口保证了系统的稳定可靠,避免应用程序肆意妄行。 一、与内核通信 系统调用在用户空间进程和硬件设备之间添加了一个中…

阿里云——云存储:对象存储管理与安全

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​ 目录 一.传统存储介绍: 1.存储的发展历史 2.硬盘发展历史与趋势 3.SDD硬盘介…

谷歌浏览器最新版本进行控制台调试js代码时候无法显示代码行数

问题描述 谷歌浏览器打开控制台进行js代码调试,js代码没有行数显示想当难受 原因分析: 最新版本谷歌浏览器进行了自动设置关闭那个功能,要自己去设置 解决方案: 最终效果 舒服了

用C++/JS/Python/Java代码描述秋天的味道

前言 秋天是一个充满诗意和浪漫的季节,它带来了清新、芬芳和美食的味道。让我们一起探索如何用编程语言来写出秋天味道的代码吧!无论是C、JavaScript、Python还是Java,以下是几个简单的步骤来帮助你创造出充满秋天味道的代码: …

ChatGPT的创造力已达到人类顶尖水平-蒙大拿大学研究

美国蒙大拿大学的一项新研究表明,ChatGPT的创造力已经达到了前1%的人类思想家水平。研究人员对ChatGPT进行了托兰斯创造力思维测验(TTCT, Torrance Tests of Creative Thinking),并记录了8个回答。此外,他们…

C++破坏电脑病毒

写了这么多python病毒,今天我来给大家分享一个C病毒。 创作背景:我有个同学对电脑十分精通,而且对MBR十分感兴趣,他跟我分享了他怎么把MBR搞报废的历程。听完之后,我开始研究MBR。用python研究了2个月,结果…

Apache和Nginx各有什么优缺点,应该如何选择?

Apache和Nginx各有什么优缺点,应该如何选择? Apache和Nginx都有各自的优点和缺点,选择应该根据您的具体需求而定。Nginx的优点包括:轻量级,与同等web服务相比,Nginx占用更少的内存和资源;抗并发…

面试热题(不同的二分搜索树)

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 经典的面试题,这部分涉及了组合数学中的卡特兰数,如果对其不清楚的同学可以去看我以前的博客卡特兰数 …

stack,queue,deque的使用

1.stack是后进先出的&#xff0c;这也影响其对应的接口&#xff0c;所能实现的功能也有限&#xff0c;其中主要的功能如下&#xff1a; void test_stack1() {stack<int> st;st.push(1);st.push(2);st.push(3);st.push(4);st.push(5);st.push(6);while (!st.empty()){c…

代码随想录打卡—day24—【回溯】— 基础,最新820 8.21 todo

1 理论基础 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。回溯算法——回溯和递归是相辅相成的。回溯法的效率&#xff0c;回溯法其实就是暴力查找&#xff0c;并不是什么高效的算法。回溯法解决的问题都可以抽象为树形结构&#xff08;N叉树&#xff09; 1.1…

Linux面试笔试题(1)

1、以长格式列目录时&#xff0c;若文件test的权限描述为&#xff1a;drwxrw-r–&#xff0c;则文件test的类型及文件主的权限是__A____。 A.目录文件、读写执行 B.目录文件、读写 C.普通文件、读写 D.普通文件、读 在这个问题中&#xff0c;我们需要解析文件权限的描述&…

【记录】Python3|selenium4 极速上手入门(Windows)

环境&#xff1a;Windows 版本&#xff1a;python3&#xff0c;selenium 4.11.2 文章目录 1 装ChromeEdge其他浏览器 2 运行报错RequestsDependencyWarning: urllib3 (1.26.9) or chardet (3.0.4) doesn‘t match a supported version打开了浏览器&#xff0c;但是没有显示网页…

李沐pytorch学习-经典CNN的原理及代码实现

一、LeNet 1.1 模型结构 LeNet结构如图1所示&#xff0c;汇聚层即池化层&#xff0c;这里池化Stride&#xff08;步幅&#xff09;与池化层长宽一致&#xff0c;因此使得池化后大小减半。 图1. LeNet结构 1.2 代码实现 代码实现如下&#xff1a; import torch from torch imp…

KDAB QML学习笔记Day3(5,6,7,8)

KDAB QML学习笔记Day3&#xff08;5,6,7,8&#xff09; 学习视频链接&#xff1a;Introduction to Qt / QML - all videos so far - YouTube B站链接&#xff1a;Introduction to Qt / QML_哔哩哔哩_bilibili Part05&#xff0c;06 示例代码 import QtQuick 2.15 import Q…

根据源码,模拟实现 RabbitMQ - 虚拟主机设计(5)

目录 一、虚拟主机设计 1.1、需求分析 1.1.1、核心 API 1.1.2、虚拟主机的是用来干什么的&#xff1f; 1.1.3、如何表示 交换机和虚拟主机 之间的从属关系&#xff1f; 二、实现 VirtualHost 类 2.1、属性 2.2、锁对象 2.3、公开实例 2.4、虚拟主机构造方法 2.5、交…

Ubuntu系统更换Linux内核的详细方法汇总

文章目录 一、写在前面二、方法一&#xff08;手动下载编译安装Linux内核并更换&#xff09;三、方法二&#xff08;自动下载安装Linux内核并更换&#xff09;四、最后总结 一、写在前面 最近在复现Linux内核漏洞的时候&#xff0c;经常需要更换Ubuntu系统的Linux内核版本&…

索引下推及具体实践

什么是索引下推 索引下推(Index Condition Pushdown&#xff0c;简称ICP)&#xff0c;是MySQL5.6版本的新特性&#xff0c;它能减少回表查询次数&#xff0c;提高查询效率。 索引下推优化的原理 我们先简单了解一下MySQL大概的架构&#xff1a; MySQL服务层负责SQL语法解析…

Spring 中 @Primary 注解的原理是什么?

1. 问题分析 当我们使用 Spring 的时候&#xff0c;有时候会遇到下面这种情况。 假设我有 A、B 两个类&#xff0c;在 A 中注入 B&#xff0c;如下&#xff1a; Component public class A {AutowiredB b; }至于 B&#xff0c;则在配置类中存在多个实例&#xff1a; Configu…