Python中如何使用os模块和shutil模块处理文件和文件夹 您所在的位置:网站首页 python文件的处理 Python中如何使用os模块和shutil模块处理文件和文件夹

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

2023-06-03 02:25| 来源: 网络整理| 查看: 265

亿牛云代理

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://:@:/

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)

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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有