shutil 模块

shutil 模块可以让我们很方便的在Python程序中复制、移动、改名和删除文件。

复制文件和文件夹

使用shutil.copy()来复制文件,该函数含两个参数,均为字符串格式的路径。当第二个参数为文件时,就将原文件复制过来并改名,当第二个参数为文件夹时,就将原文件复制至该文件夹下。

>>> import shutil
>>> shutil.copy('oldFolder/hello.txt', 'newFolder')
'newFolder\\hello.txt'
>>> shutil.copy('oldFolder/hello.txt', 'newFolder/hello_2.txt')
'newFolder/hello_2.txt'

值得注意的是,在将文件复制至一个文件夹下时,如果这个文件夹不存在,程序就会误以为你要将原文件命名为第二个参数的名称,导致出现歧义。如下:

>>> shutil.copy('oldFolder/hello.txt', 'newFolder')
'newFolder'

使用shutil.copytree()来复制文件夹及其包含的文件。用法如下:

>>> shutil.copytree('oldFolder', 'oldFolder_backup')
'oldFolder_backup'

文件和文件夹的移动与改名

使用shutil.move()函数来移动文件或文件夹,用法与上一节的shutil.copy()函数大同小异。

>>> shutil.move('oldFolder', 'newFolder')
'newFolder\\oldFolder'
>>> shutil.move('newFolder\\oldFolder\\hello.txt', 'oldFolder_backup\\hello_2.txt')
'oldFolder_backup\\hello_2.txt'

永久删除文件和文件夹

  • 使用os.unlink(path)来永久删除一个文件;
  • os.rmdir(path)来永久删除一个空文件夹
  • shutil.rmtree(path)来永久删除一个文件夹及其中所有内容。

为了确保不会因为输入有误错误删除重要文件,我们可以先运行下面的程序。

import os
for filename in os.listdir():
if filename.endswith('.txt'):
# os.unlink(filename)
print(filename)

再确认无误之后,再删除print行,并去除删除文件行代码的注释。

使用send2trash 模块安全删除

上一节中的三个方法都是永久的删除文件或文件夹,所以在使用起来可能会有风险。使用send2trash方法可以将文件或文件夹移入回收站,方便误删后的恢复。在使用send2trash方法前,我们先要安装它。

>>> import send2trash
>>> dogList = open('dog.txt', 'w')
>>> dogList.write("I'm a cat.")
10
>>> dogList.close()
>>> send2trash.send2trash('dog.txt')
>>> send2trash.send2trash('oldFolder_backup')

遍历目录树

处理一个文件夹及其子文件夹下的所有文件可能会是一个复杂的操作,但是python 提供了一个函数os.walk(),方便了这个过程。该函数接收一个路径参数,返回该路径下的子文件夹名称及文件名称并层层遍历。

假如在当前文件夹下有一个文件夹cat 其文件目录如下:

我们可以使用下面的代码来输出cat 文件夹下的所有子文件夹及文件名称字符串。

import os

for folderName, subfolders, filenames in os.walk('.\\cat'):
print('The current folder is ' + folderName) for subfolder in subfolders:
print('SUBFOLDER OF ' + folderName + ': ' + subfolder)
for filename in filenames:
print('FILE INSIDE ' + folderName + ': ' + filename) print('')

输出结果如下:

The current folder is .\cat
SUBFOLDER OF .\cat: Libai
SUBFOLDER OF .\cat: Zhongfen The current folder is .\cat\Libai
FILE INSIDE .\cat\Libai: head.jpg
FILE INSIDE .\cat\Libai: info.txt The current folder is .\cat\Zhongfen
FILE INSIDE .\cat\Zhongfen: head.jpg
FILE INSIDE .\cat\Zhongfen: info.txt

使用zipfile模块处理压缩文件

我们将上一节中的cat 文件夹压缩为一个zip 压缩文件,在本节使用。

读取zip 文件

要读取zip 文件,首先创建一个ZipFile 对象。具体用法如下:

>>> import zipfile
>>> import os
>>> catZip = zipfile.ZipFile('cat.zip')
>>> catZip.namelist()
['cat/', 'cat/Libai/', 'cat/Libai/head.jpg', 'cat/Libai/info.txt', 'cat/Zhongfen/', 'cat/Zhongfen/head.jpg',
'cat/Zhongfen/info.txt']
>>> libaiInfo = catZip.getinfo('cat/Libai/info.txt')
>>> libaiInfo.file_size
0
>>> libaiInfo.compress_size
0

从zip 文件中解压缩

ZipFile 对象的extractall()方法从ZIP 文件中解压缩所有文件和文件夹,放到当前工作目录中。

>>> catZip.extractall()
>>> catZip.close()

ZipFile 对象的extract()方法从ZIP文件中解压出单个文件。

>>> catZip.extract('cat/Libai/info.txt', 'D:\\')
'D:\\cat\\Libai\\info.txt'

其中第二个参数为解压缩后文件的位置,他将在后续被输出出来。

创建和添加到ZIP 文件

要创建一个压缩文件,必须以写模式打开ZipFile 对象,即传入“w”作为第二个参数,但这会删除压缩文件中原有的内容,若要向压缩文件中添加新内容,可以以“a”作为第二个参数打开。

>>> newZip = zipfile.ZipFile('new.zip', 'w')
>>> newZip.write('cat/Libai/info.txt', compress_type=zipfile.ZIP_DEFLATED)
>>> newZip.close()

小项目

假定我们在做一个项目,它的文件保存在 ./cat 文件夹中。我们担心工作会丢失,所以希望为整个文件夹创建一个ZIP 文件,作为“快照”。希望保存不同的版本,希望ZIP 文件的文件名每次创建时都有所变化。例如cat_1.zip、cat_2.zip等。

import zipfile
import os def backup2zip(folder):
# Backup the entire contents of "folder" into a ZIP file.
folder = os.path.abspath(folder) # make sure folder is absolute # Figure out the filename this code should use based on what files already exist.
number = 1
while True:
zipFilename = os.path.basename(folder) + "_" + str(number) + '.zip'
if not os.path.exists(zipFilename):
break
number = number + 1 # Create the ZIP file.
print("Create %s..." % (zipFilename))
backupZip = zipfile.ZipFile(zipFilename, "w") # Walk the entire folder tree and compress the files in each folder.
for foldername, subfolders, filenames in os.walk(folder):
print("Adding files in %s..." % (foldername))
# Add the current folder to ZIP file.
backupZip.write(foldername)
# Add all the files in this folder to the ZIP file.
for filename in filenames:
newBase = os.path.basename(folder) + '_'
if filename.startswith(newBase) and filename.endswith('.zip'):
continue
backupZip.write(os.path.join(foldername, filename))
backupZip.close()
print('Done.') backup2zip('./cat')

[Python学习笔记]系列是我在学习《Python编程快速上手——让繁琐工作自动化(Automate The Boring Stuff With Python)》这本书时的学习笔记。通过自己再手敲一遍概念和代码,方便自己记忆和日后查阅。如果对你有帮助,那就更好了!

[Python学习笔记]组织文件的更多相关文章

  1. Python学习笔记之文件处理

    1.打开和关闭 要打开文件可以使用函数 open(),它位于自动导入模块 io 中.函数将文件名作为唯一不可缺少的函数,并返回一个文件对象.它还有一个名叫 mode 的参数,用于指定文件模式,其可取值 ...

  2. Python学习笔记015——文件file的常规操作之一(文本文件)

    1 什么是文件 文件是用于数据存储的单位 文件通常用来长期保存数据 读写文件是最常见的I/O操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件的功能都是由操作系统提供的,一般而言,操 ...

  3. python学习笔记(11):文件的访问与函数式编程

    一.文本文件读写的三种方法 1.直接读入 file1 = open('E:/hello/hello.txt') file2 = open('output.txt','w') #w是可写的文件 whil ...

  4. python学习笔记(7)文件的访问与函数式编程

    一.文件读写的3中方法 1.直接读入 fiel1=open('test.txt') file2=open('output.txt') while True: line=file1.readLine() ...

  5. python学习笔记(六)---文件操作与异常处理机制

    文件读取 读取整个文件 要读取文件,需要一个包含几行文本的文件.下面首先来创建一个文件,它包含精确到小数点后30位的圆周率值,且在小数点后每10位处都换行: pi_digits.txt 3.14159 ...

  6. 转载-Python学习笔记之文件读写

    Python 文件读写 Python内置了读写文件的函数,用法和C是兼容的.本节介绍内容大致有:文件的打开/关闭.文件对象.文件的读写等. 本章节仅示例介绍 TXT 类型文档的读写,也就是最基础的文件 ...

  7. python学习笔记之文件操作(三)

    这篇博客小波主要介绍一下python对文件的操作 对文件的操作主要分为三步: 1.打开文件获取文件的句柄,句柄也是文件描述符 2.通过文件句柄操作文件 3.关闭文件. 现有以下文件,是小波随写的周杰伦 ...

  8. python学习笔记4(文件操作)

    文件操作: 1.f=open(”caidan”,”w”,encoding=”utf8”)      直接打开一个文件,如果文件不存在则创建文件 f.close() 2.with open (”caid ...

  9. 转载-python学习笔记之文件I/O

    Python 文件I/O 本章只讲述所有基本的的I/O函数,更多函数请参考Python标准文档. 打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个用逗号隔开的表达式.此函数把你 ...

随机推荐

  1. 跨边界传输之反弹shell

    反弹shell     1.nc         正向连接             攻击机                 nc-vv 受害者ip 受害者port             受害者    ...

  2. (Linux环境Kafka集群安装配置及常用命令

    Linux环境Kafka集群安装配置及常用命令 Kafka 消息队列内部实现原理 Kafka架构 一.下载Kafka安装包 二.Kafka安装包的解压 三.设置环境变量 四.配置kafka文件 4.1 ...

  3. 【有趣的全彩LED | 编程】用STM32 HAL库让WS2812B为你所动

    一.效果展示 观看演示效果:https://www.bilibili.com/video/BV1dv411Y7x3 使用STM32 HAL库编程 PWM+DMA控制输出,CubeMX生成初始工程 实现 ...

  4. P1255 数楼梯 Python实现

    题目描述 楼梯有N阶,上楼可以一步上一阶,也可以一步上二阶. 编一个程序,计算共有多少种不同的走法. 输入格式 一个数字,楼梯数. 输出格式 走的方式几种. 输入输出样例 输入 #1 4 输出 #1 ...

  5. 封装Vue Element的可编辑table表格组件

    前一段时间,有博友在我那篇封装Vue Element的table表格组件的博文下边留言说有没有那种"表格行内编辑"的封装组件,我当时说我没有封装过这样的组件,因为一直以来在实际开发 ...

  6. zjnu1735BOB (单调队列,单调栈)

    Description Little Bob is a famous builder. He bought land and wants to build a house. Unfortunately ...

  7. Codeforces Round #660 (Div. 2) A. Captain Flint and Crew Recruitment、Captain Flint and a Long Voyage

    题目链接:Captain Flint and Crew Recruitment 题意: t组输入,每一组输入一个n.这里我们说一下题目定义的近似质数概念: "如果可以将正整数x表示为p⋅q, ...

  8. Strategic game POJ - 1463 树型dp

    //题意:就是你需要派最少的士兵来巡查每一条边.相当于求最少点覆盖,用最少的点将所有边都覆盖掉//题解://因为这是一棵树,所以对于每一条边的两个端点,肯定要至少有一个点需要放入士兵,那么对于x-&g ...

  9. K8S(01)二进制部署实践-1.15.5

    系列文章说明 本系列文章,可以基本算是 老男孩2019年王硕的K8S周末班课程 笔记,根据视频来看本笔记最好,否则有些地方会看不明白 需要视频可以联系我 目录 系列文章说明 1 部署架构 1.1 架构 ...

  10. Spring(四) SpringDI(1)

    Spring 自动装配之依赖注入 依赖注入发生的时间 当 Spring IOC 容器完成了 Bean 定义资源的定位.载入和解析注册以后,IOC 容器中已经管理类 Bean 定义的相关数据,但是此时 ...