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. 详解Java8特性之新的日期时间 API

    详解Java8特性之新的日期时间 API http://blog.csdn.net/timheath/article/details/71326329 Java8中时间日期库的20个常用使用示例 ht ...

  2. Tomcat Servlet工作原理

    前言 Tomcat的启动过程 Web应用初始化 创建Servlet实例 初始化Servlet 执行service方法 前言 Servlet实际上就是一个java类,只不过可以和浏览器进行一些数据的交换 ...

  3. Python3 注释、运算符、数字、字符串

    文章目录 注释 单引号(''') 双引号(""") 运算符 数字(Number) Python 数字类型转换 数学函数 随机数函数 三角函数 数学常量 数字与字符,列表之 ...

  4. Poem 01(转)

    Dear Sunshine The way you glow through my blinds in the morning. It makes me feel like you missed me ...

  5. Cisco静态路由

    怎样让身在两个网段的终端会话交流呢?我们借用Cisco packet研究一下Cisco静态路由. 名词解释: 网关:(Gateway)网间连接器,或叫协议转换器:举例(参考https://baike. ...

  6. IP路由__IP路由选择过程

    1.主机A上的某个用户ping主机B的IP地址 1.主机A的因特网控制报文协议(ICMP)将创建一个回应请求数据包(在它的数据域中只包含有字母). 2. ICMP将把这个有效负荷交给因特网协议(IP) ...

  7. 小白搭建WAMP详细教程---apache安装与设置

    一.apache官网下载Apache HTTP Server服务器 1.打开apache官网http://www.apache.org/,拉到最底下,找到HTTP Server,点击进去下载.也可以直 ...

  8. Luogu T9376 区间GCD

    题目背景 无 题目描述 给定一长度为n的动态序列,请编写一种数据结构,要求支持m次操作,包括查询序列中一闭区间中所有数的GCD,与对一闭区间中所有数加上或减去一个值. 输入输出格式 输入格式: 第1行 ...

  9. 【uva 1152】4 Values Whose Sum is Zero(算法效率--中途相遇法+Hash或STL库)

    题意:给定4个N元素几个A,B,C,D,要求分别从中选取一个元素a,b,c,d使得a+b+c+d=0.问有多少种选法.(N≤4000,D≤2^28) 解法:首先我们从最直接最暴力的方法开始思考:四重循 ...

  10. QQ空间自动点赞js代码

    1.jQuery().each(): each() 方法为每个匹配元素规定要运行的函数. 提示:返回 false 可用于及早停止循环. 函数原型: function(index,element) 为每 ...