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

简介: os和shutil都是Python标准库中用于处理文件和文件夹的模块,它们都提供了许多常用的文件和文件夹操作功能,但是它们的使用场景和优势有所不同。os模块和shutil模块各自具有不同的优势,可以根据实际需要选择使用。如果只需要对单个文件或目录进行基本的文件操作,可以使用os模块;如果需要复制或移动多个文件或目录,或者需要进行文件和目录的压缩和解压缩,就应该使用shutil模块。有些需求同时使用两者才能满足要求

bd5c8.jpeg

os和shutil都是Python标准库中用于处理文件和文件夹的模块,它们都提供了许多常用的文件和文件夹操作功能,但是它们的使用场景和优势有所不同。

os模块提供了许多操作系统相关的功能,例如打开文件、读取文件、获取文件属性、创建目录、删除文件、重命名文件等。os模块提供的函数通常操作单个文件或目录,但它不提供直接复制文件或目录的方法。如果需要在Python中复制文件或目录,就需要使用shutil模块。

shutil模块是在os模块的基础上开发的,提供了许多高级的文件和文件夹操作功能,例如复制文件、复制目录、移动文件、移动目录等。shutil模块比os模块更加高级、更加方便,可以用来处理一系列文件和文件夹操作,而不仅仅是单个文件或目录。同时,shutil模块也可以处理文件和目录的压缩和解压缩。

因此,os模块和shutil模块各自具有不同的优势,可以根据实际需要选择使用。如果只需要对单个文件或目录进行基本的文件操作,可以使用os模块;如果需要复制或移动多个文件或目录,或者需要进行文件和目录的压缩和解压缩,就应该使用shutil模块。有些需求同时使用两者才能满足要求,例如做一个文件同步的程序,需要满足如下要求:

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

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

importosimportshutil#定义源路径和目标路径src_base_path="/mnt/datalake"dst_base_path="/dst"#定义要复制的文件和文件夹列表copy_list= [
"Folder1/file2.csv",
"Folder1/file3.csv",
"Folder1/file4.csv",
"Folder4/Folder5/Folder7"]
#遍历要复制的列表foritemincopy_list:
#拼接完整的源路径和目标路径src_path=os.path.join(src_base_path, item)
dst_path=os.path.join(dst_base_path, item)
#如果是文件ifos.path.isfile(src_path):
#检查目标路径是否存在,如果不存在则创建dst_dir=os.path.dirname(dst_path)
ifnotos.path.exists(dst_dir):
os.makedirs(dst_dir)
#检查源文件是否比目标文件更新,或者目标文件不存在ifnotos.path.exists(dst_path) oros.path.getmtime(src_path) >os.path.getmtime(dst_path):
#复制文件,并保留元数据shutil.copy2(src_path, dst_path)
print(f"Copied file {src_path} to {dst_path}")
#如果是文件夹elifos.path.isdir(src_path):
#遍历源文件夹中的所有子文件夹和文件forroot, dirs, filesinos.walk(src_path):
#对于每个子文件夹和文件,拼接相对路径rel_path=os.path.relpath(root, src_path)
fordindirs:
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)
#检查目标路径是否存在,如果不存在则创建ifnotos.path.exists(dst_sub_dir):
os.makedirs(dst_sub_dir)
print(f"Created directory {dst_sub_dir}")
forfinfiles:
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)
#检查源文件是否比目标文件更新,或者目标文件不存在ifnotos.path.exists(dst_sub_file) oros.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}")

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

importrequests#亿牛云动态转发#爬虫加强版代理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请求withopen(file_path, 'rb') asf:
response=session.post(url, data=f, headers=headers, auth=proxy_auth)
#打印响应结果print(response.text)

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

相关文章
|
13天前
|
Python
文件元数据获取方法对比:`os.path` 与 `os.stat`
本文对比了Python中两种获取文件元数据的方法:`os.path`和`os.stat`。通过示例代码展示了如何获取文件大小和修改时间,并从性能、功能性和代码可读性三方面进行了详细对比。最终给出了根据具体需求选择合适方法的最佳实践建议。
21 2
|
1月前
|
开发者 Python
Python中__init__.py文件的作用
`__init__.py`文件在Python包管理中扮演着重要角色,通过标识目录为包、初始化包、控制导入行为、支持递归包结构以及定义包的命名空间,`__init__.py`文件为组织和管理Python代码提供了强大支持。理解并正确使用 `__init__.py`文件,可以帮助开发者更好地组织代码,提高代码的可维护性和可读性。
31 2
|
20天前
|
JavaScript 前端开发 Python
python中的OS模块的基本使用
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。博客分享前端技术及全栈开发经验,持续更新中,期待您的关注和支持!🎉🎉🎉
28 0
|
21天前
|
中间件 Docker Python
【Azure Function】FTP上传了Python Function文件后,无法在门户页面加载函数的问题
通过FTP上传Python Function至Azure云后,出现函数列表无法加载的问题。经排查,发现是由于`requirements.txt`中的依赖包未被正确安装。解决方法为:在本地安装依赖包到`.python_packages/lib/site-packages`目录,再将该目录内容上传至云上的`wwwroot`目录,并重启应用。最终成功加载函数列表。
|
2月前
|
Java Python
> python知识点100篇系列(19)-使用python下载文件的几种方式
【10月更文挑战第7天】本文介绍了使用Python下载文件的五种方法,包括使用requests、wget、线程池、urllib3和asyncio模块。每种方法适用于不同的场景,如单文件下载、多文件并发下载等,提供了丰富的选择。
|
1月前
|
安全 Linux 数据安全/隐私保护
Vanilla OS:下一代安全 Linux 发行版
【10月更文挑战第30天】
48 0
Vanilla OS:下一代安全 Linux 发行版
|
1月前
|
人工智能 安全 Linux
|
5月前
|
安全 Linux 网络安全
部署07--远程连接Linux系统,利用FinalShell可以远程连接到我们的操作系统上
部署07--远程连接Linux系统,利用FinalShell可以远程连接到我们的操作系统上
|
2月前
|
Unix 物联网 大数据
操作系统的演化与比较:从Unix到Linux
本文将探讨操作系统的历史发展,重点关注Unix和Linux两个主要的操作系统分支。通过分析它们的起源、设计哲学、技术特点以及在现代计算中的影响,我们可以更好地理解操作系统在计算机科学中的核心地位及其未来发展趋势。
|
4月前
|
编解码 安全 Linux
基于arm64架构国产操作系统|Linux下的RTMP|RTSP低延时直播播放器开发探究
这段内容讲述了国产操作系统背景下,大牛直播SDK针对国产操作系统与Linux平台发布的RTMP/RTSP直播播放SDK。此SDK支持arm64架构,基于X协议输出视频,采用PulseAudio和Alsa Lib处理音频,具备实时静音、快照、缓冲时间设定等功能,并支持H.265编码格式。此外,提供了示例代码展示如何实现多实例播放器的创建与管理,包括窗口布局调整、事件监听、视频分辨率变化和实时快照回调等关键功能。这一技术实现有助于提高直播服务的稳定性和响应速度,适应国产操作系统在各行业中的应用需求。
125 3