Python中如何使用os模块和shutil模块处理文件和文件夹

news2024/11/15 22:41:56

亿牛云代理

os和shutil都是Python标准库中用于处理文件和文件夹的模块,它们都提供了许多常用的文件和文件夹操作功能,但是它们的使用场景和优势有所不同。
os模块提供了许多操作系统相关的功能,例如打开文件、读取文件、获取文件属性、创建目录、删除文件、重命名文件等。os模块提供的函数通常操作单个文件或目录,但它不提供直接复制文件或目录的方法。如果需要在Python中复制文件或目录,就需要使用shutil模块。
shutil模块是在os模块的基础上开发的,提供了许多高级的文件和文件夹操作功能,例如复制文件、复制目录、移动文件、移动目录等。shutil模块比os模块更加高级、更加方便,可以用来处理一系列文件和文件夹操作,而不仅仅是单个文件或目录。同时,shutil模块也可以处理文件和目录的压缩和解压缩。
因此,os模块和shutil模块各自具有不同的优势,可以根据实际需要选择使用。如果只需要对单个文件或目录进行基本的文件操作,可以使用os模块;如果需要复制或移动多个文件或目录,或者需要进行文件和目录的压缩和解压缩,就应该使用shutil模块。有些需求同时使用两者才能满足要求,例如做一个文件同步的程序,需要满足如下要求:

  • 第一次运行时,所有文件都会从源路径复制到目标路径。
  • 只有当源文件比目标文件更新时,才复制选定的文件和选定的文件夹(以及所有子文件夹和文件)。
  • 后续运行时,只复制更新的文件和任何新添加到复制列表的文件。
  • 文件夹的结构需要保持不变,所以如果只复制某个文件夹,那么完整的结构也会被创建,但只包含该文件夹中的数据。

根据以上要求,可以提供程序如下:

import os
import shutil

# 定义源路径和目标路径
src_base_path = "/mnt/datalake"
dst_base_path = "/dst"

# 定义要复制的文件和文件夹列表
copy_list = [
    "Folder1/file2.csv",
    "Folder1/file3.csv",
    "Folder1/file4.csv",
    "Folder4/Folder5/Folder7"
]

# 遍历要复制的列表
for item in copy_list:
    # 拼接完整的源路径和目标路径
    src_path = os.path.join(src_base_path, item)
    dst_path = os.path.join(dst_base_path, item)

    # 如果是文件
    if os.path.isfile(src_path):
        # 检查目标路径是否存在,如果不存在则创建
        dst_dir = os.path.dirname(dst_path)
        if not os.path.exists(dst_dir):
            os.makedirs(dst_dir)

        # 检查源文件是否比目标文件更新,或者目标文件不存在
        if not os.path.exists(dst_path) or os.path.getmtime(src_path) > os.path.getmtime(dst_path):
            # 复制文件,并保留元数据
            shutil.copy2(src_path, dst_path)
            print(f"Copied file {src_path} to {dst_path}")

    # 如果是文件夹
    elif os.path.isdir(src_path):
        # 遍历源文件夹中的所有子文件夹和文件
        for root, dirs, files in os.walk(src_path):
            # 对于每个子文件夹和文件,拼接相对路径
            rel_path = os.path.relpath(root, src_path)
            for d in dirs:
                sub_dir = os.path.join(rel_path, d)
                # 拼接完整的源路径和目标路径
                src_sub_dir = os.path.join(src_path, sub_dir)
                dst_sub_dir = os.path.join(dst_path, sub_dir)
                # 检查目标路径是否存在,如果不存在则创建
                if not os.path.exists(dst_sub_dir):
                    os.makedirs(dst_sub_dir)
                    print(f"Created directory {dst_sub_dir}")
            for f in files:
                sub_file = os.path.join(rel_path, f)
                # 拼接完整的源路径和目标路径
                src_sub_file = os.path.join(src_path, sub_file)
                dst_sub_file = os.path.join(dst_path, sub_file)
                # 检查源文件是否比目标文件更新,或者目标文件不存在
                if not os.path.exists(dst_sub_file) or os.path.getmtime(src_sub_file) > os.path.getmtime(dst_sub_file):
                    # 复制文件,并保留元数据
                    shutil.copy2(src_sub_file, dst_sub_file)
                    print(f"Copied file {src_sub_file} to {dst_sub_file}")

当发现文件目录或文件有创建或更新的时候进行远程传输,就可以实现一个云同步的文档管理程序。文件传输程序如下:

import requests

# 亿牛云 动态转发
# 爬虫加强版 代理IP地址和端口号
proxy_host = 'www.16yun.cn'
proxy_port = '31000'

# 爬虫加强版 代理IP的用户名和密码,采用HTTP基本认证方式
proxy_username = '16IP'
proxy_password = '16YUN'

# 目标文件路径
file_path = '/path/to/your/file'

# 目标URL地址
url = 'http://your-target-url.com'

# 构造HTTP代理的认证信息
proxy_auth = requests.auth.HTTPProxyAuth(proxy_username, proxy_password)

# 构造HTTP请求头,指定Content-Type为multipart/form-data,表示发送的数据为文件
headers = {'Content-Type': 'multipart/form-data'}

# 构造HTTP代理地址,格式为http://<username>:<password>@<host>:<port>/
proxy_url = f'http://{proxy_username}:{proxy_password}@{proxy_host}:{proxy_port}/'

# 构造requests.Session对象,并设置 爬虫加强版 代理IP地址和端口号
session = requests.Session()
session.proxies = {'http': proxy_url, 'https': proxy_url}

# 打开文件,并将文件内容作为data参数发送POST请求
with open(file_path, 'rb') as f:
    response = session.post(url, data=f, headers=headers, auth=proxy_auth)

# 打印响应结果
print(response.text)

结合上述两个程序,就可以轻松实现远程文件目录和文档的管理及同步。

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

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

相关文章

阿里云服务器ECS上安装Redis数据库流程by Alibaba Cloud Linux

阿里云服务器操作系统Alibaba Cloud Linux 2针对Redis应用进行了专项调优&#xff0c;相比社区版操作系统&#xff0c;Redis应用整体性能提升20%以上。Alibaba Cloud Linux 2内置Redis 6.0.5和Redis 3.2.12的yum源&#xff0c;执行sudo yum install命令即可部署Redis 6.0.5和Re…

【Redis—哨兵机制】

概念 当进行主从复制时&#xff0c;如果主节点挂掉了&#xff0c;那么没有主节点来服务客户端的写操作请求了&#xff0c;也没有主节点给从节点进行数据同步了。此时需要进行主从切换&#xff08;主从节点故障转移&#xff09;&#xff0c;Redis在 2.8 版本以后提供的哨兵&…

海外新闻稿:如何写好英语新闻稿的开头与结尾?

随着全球化的发展&#xff0c;英语已成为一种全球性的语言。在现代社会&#xff0c;英语新闻稿已经成为了各个行业重要的宣传方式。然而&#xff0c;如何写好英语新闻稿的开头与结尾却是一门很深的学问。在本文中&#xff0c;我们将探讨如何写出一个成功的英语新闻稿开头和结尾…

一个前端大佬的十年回顾 | 漫画前端的前世今生

作者&#xff1a;京东科技 胡骏 引言 岁月如梭&#xff0c;十载流年 前端技术&#xff0c;蓬勃向前 HTML&#xff0c;CSS&#xff0c;JavaScript 演绎出璀璨夺目的技术画卷 回到十年前&#xff0c;前端技术就像一名戴着厚重眼镜的书呆子&#xff0c;总是小心翼翼&#xff…

vue 使用 threejs 实现实景看房效果 demo

vue 使用 threejs 实现实景看房效果 demo 关于这个 threejs 实现 VR 看房效果也超级简单&#xff0c;只需要提供一个思路的话就可以了其实&#xff0c;首先需要一个房间结构的贴图&#xff0c;这个贴图网上有&#xff0c;当然找个合适的也不好找&#xff0c;我找了一上午在别人…

大模型商业的搅局者?除了谷歌和微软,你可能忘记了它!

夕小瑶科技说 原创 作者 | 小戏、iven 大模型的商业大戏愈发精彩了&#xff0c;这边是谷歌和 OpenAI 剑拔弩张军备竞赛&#xff0c;那边是各路豪强的大模型应用雪花般的涌来&#xff0c;你方唱罢我登场。 而在这串作为大模型先行者而出现的公司以及研究院的名字中&#xff0c;…

6WINDGate-whitepaper

6WINDGate Witerpaper Author&#xff1a;Once Day Date&#xff1a;2023年4月29日 本文是对6WIND官网文档的整理和翻译&#xff0c;仅供学习和研究之用&#xff0c;原始文章可参考下面文档&#xff1a; 6WINDGate Documentation - 6WIND6WINDGate Modules — 6WINDGate Mod…

万字长文 - Nature 综述系列 - 给生物学家的机器学习指南 3 (人工神经网络)

万字长文 - Nature 综述系列 - 给生物学家的机器学习指南 1 万字长文 - Nature 综述系列 - 给生物学家的机器学习指南 2 &#xff08;传统机器学习方法如何选择&#xff09; 人工神经网络 人工神经网络模型得名于这样一个事实&#xff0c;即所拟合的数学模型的形式受到大脑中神…

一个新的ubuntu

1 安装cmake 方法一&#xff1a;现成的教程 ubuntu安装cmake_yuanzhoulvpi的博客-CSDN博客 方法二&#xff1a;自己总结的 安装openssl系统&#xff1a;sudo apt-get install libssl-dev 安装&#xff1a;sudo apt-get install build-essential 以上是防止安装cmake时缺少文…

Ubuntu零基础安装

Ubuntu零基础安装 首先我们需要安装VM&#xff0c;再安装ubuntu。 1、安装VM 进入VM官网 VM官网地址 选择下载试用版 下载Windows版本 下载完成后&#xff0c;点击安装包进行安装 至此就安装完毕了。 桌面会出现VM的图标。 点击打开&#xff0c;弹出如下画面&#xff1a; …

基于Springboot的旅游网管理系统后台

目录 一. &#x1f981; 研究背景及意义二. &#x1f981; 技术栈系列及主要功能Ⅰ. 技术栈Ⅱ. 主要功能 三. &#x1f981; 项目搭建Ⅰ. 后端模块Ⅱ. 前端模块 四. &#x1f981; 主要实现过程Ⅰ. 认证和授权1. SpringSecurity配置类2. 自定义逻辑认证 Ⅱ. 富文本编辑器——wa…

边无际CEO陈永立:让ChatGPT通过物联网看到世界

如何利用ChatGPT及其插件&#xff0c;将AI与物联网设备相连&#xff1f; 通过Shifu Plugin获取摄像头的实时画面 我们都认识到&#xff0c;ChatGPT引发了一连串的技术变革。作为一个对AI和物联网技术充满热情的开发者&#xff0c;获得ChatGPT插件的早期访问权限&#xff0c;是…

Table 表格 + Pagination 分页

<el-table>属性 v-loading 加载动画 data 显示的数据 border 是否带有纵向边框 fit 列的宽度是否自撑开 highlight-current-row 是否要高亮当前行 row-style 行的 style 的回调方法&#xff0c;也可以使用一个固定的 Object 为所有行设置一样的 Style…

Android - 深色主题

一、简介 我们一直以来使用的操作系统都是以浅色主题为主的&#xff0c;这种主题模式在白天或者是光线充足的 情况下使用起来没有任何问题&#xff0c;可是在夜晚灯光关闭的情况下使用就会显得非常刺眼。 于是&#xff0c;许多应用程序为了能够让用户在光线昏暗的环境下更加舒…

mysql使用innodb引擎,请简述mysql索引的最左前缀如何优化orderby语句。

关键点 如果排序字段不在索引列上&#xff0c;filesort有两种算法&#xff1a; mysql就要启动双路排序和单路排序无过滤不索引order by非最左 filesort顺序错 filesort方向反 filesort 答案 首先要对sql进行分析检查必要的查询字段&#xff0c;过滤字段&#xff0c;排序字段…

JeecgBoot免费低代码平台—多租户SAAS解决方案

JeecgBoot免费低代码平台&#xff0c;提供一键切换多租户模式机制&#xff01;快速实现全系统的saas租户方案&#xff0c;通过租户ID进行数据隔离。 租户设计思路 1、开启全系统租户隔离 开启方法 将 org.jeecg.config.mybatis.MybatisPlusSaasConfig#OPEN_SYSTEM_TENANT_CO…

Selenium:浏览器及鼠标、键盘事件

目录 一、控制浏览器 二、鼠标事件 三、键盘事件 一、控制浏览器 webdriver主要提供操作页面上各种元素的方法&#xff0c;但它也提供操作浏览器的一些方法&#xff0c;例如控制浏览器大小、前进和后退等。 1、控制浏览器窗口大小 1 # 控制浏览器大小 2 from selenium imp…

2023哪款蓝牙耳机性价比高?200左右高性价比蓝牙耳机推荐

现如今的蓝牙耳机越来越多&#xff0c;人们在选择时不免纠结&#xff0c;不知道选什么蓝牙耳机比较好&#xff1f;针对这个问题&#xff0c;我来给大家推荐几款性价比高的蓝牙耳机&#xff0c;一起来看看吧。 一、南卡小音舱Lite2蓝牙耳机 参考价&#xff1a;299 蓝牙版本&am…

常见提高SQL执行效率示例

1、减少与数据库的交互&#xff1a; 当传参是一个list集合时&#xff0c;通过遍历查询数据库会造成数据库压力过大&#xff0c;这样查询效率就比较低&#xff0c;应该减少与数据库的交互来提高查询效率&#xff1a;(这里的objId为“ljydl”,"ljtpfl") QueryWrapper&…

JavaScript全解析——本地存储的概念、用法详解

本地存储概念&#xff1a; 就是浏览器给我们提供的可以让我们在浏览器上保存一些数据 常用的本地存储 localStorage sessionStorage localStorage 特点: 1.长期存储,除非手动删除否则会一直保存在浏览器中&#xff0c;清除缓存或者卸载浏览器也就没有了 2.可以跨页面通讯,…