Bootstrap

《Python编程实训快速上手》第八天--组织文件

一、shutil模块

shutil(或称为shell工具)模块中包含一些函数,让你可以在Python程序中复制、移动、重命名和删除文件。

1、复制文件和文件夹

source       destinationdestination存在destination不存在
文件文件将 source 文件复制并覆盖 destination 文件复制 source 文件并重命名为 destination
文件目录将 source 文件复制到 destination 目录中会抛出错误(因为目标目录不存在)
目录文件无此情况无此情况
                                    shutil.copytree(source, destination) 
目录目录报错(destination 目录必须为不存在的新目录)复制整个 source 目录及其内容到 destination,并创建 destination 目录

shutil.copytree(r"E:\test", Path.cwd()/"newText")
shutil.copy(r"E:\test.txt", Path.cwd()/"newText.txt")

2、 文件和文件夹的移动与重命名

shutil.move(source, destination)
source       destinationdestination存在destination不存在
文件文件将 source 文件移动并覆盖 destination 文件将 source 文件重命名为 destination 并移动到目标位置
文件目录将 source 文件移动到 destination 目录中
  • 只有最后一级目录不存在:将source文件重命名为destination目录名(无文件扩展名的文本文件)---bug
  • 中间级目录也有不存在:报错
目录文件无此情况无此情况
目录目录将 source 目录及其内容移动到 destination 目录中将 source 目录及其内容重命名为 destination 并移动到目标路径

3、永久删除文件和文件夹

利用os模块中的函数,可以删除一个文件或一个空文件夹。利用shutil模块,可以删除一个文件夹及其所有的内容。

  • 调用os.unlink(path)将删除path处的文件。
  • 调用os.rmdir(path)将删除path处的文件夹。该文件夹必须为空,其中不能有任何文件和文件夹。
  • 调用shutil.rmtree(path)将删除path处的文件夹,它包含的所有文件和文件夹都会被删除。

小tips:为了防止误删文件,可以在第一次运行程序时注释掉这些调用,并且加上print()调用,显示会被删除的文件。

from pathlib import Path
for filename in Path.home().glob('*.rxt'):
    #os.unlink(filename)
    print(filename)

4、用send2trash模块安全地删除

send2trash会将文件夹和文件发送到计算机的回收站,而不是永久删除它们。

使用send2trash.send2trash(路径)函数来删除文件和文件夹。

二、遍历目录树

使用os.walk()函数,该函数被传入一个字符串值,即一个文件夹的路径。可以在一个for循环语句中使用os.walk()函数遍历目录树,os.walk()在循环的每次迭代中返回以下3个值:

  • 当前文件夹名称的字符串,是绝对路径
  • 当前文件夹中子文件夹的字符串的列表
  • 当前文件夹中文件的字符串的列表

遍历文件夹顺序是从上往下

import  os

for folderName, subfolders, filenames in os.walk('C:\\delicious'):
    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('')

三、 用zipfile模块压缩文件

在ZipFile对象中完成

1、读取ZIP文件

调用zipfile.ZipFile()函数创建ZipFile对象,向它传入一个字符串,表示ZIP文件的文件名。

ZipFile对象属性及其方法
namelist()返回ZIP文件中包含的所有文件和文件夹的字符串的列表
getinfo()返回一个关于特定文件的ZipInfo对象,传入字符串必须匹配namelist()返回的字符串列表中的一个
                   ZipInfo对象属性
file_size原来文件大小
compress_size压缩后文件大小

import zipfile

exampleZip = zipfile.ZipFile(r'E:\example.zip')
print(exampleZip.namelist())
catsInfo = exampleZip.getinfo("example/cats/catnames.txt")
print(catsInfo.file_size)
print(catsInfo.compress_size)


>> ['example/', 'example/cats/', 'example/cats/catnames.txt', 'example/cats/zophie.jpg', 'example/spam.txt']
>> 260
>> 198

 2、从ZIP文件中解压缩

extractall()
  • 空白:从ZIP文件中解压缩所有文件和文件夹,并将其放到当前工作目录
  • 传文件夹:从ZIP文件中解压缩所有文件和文件夹,并将其解压缩到那个文件夹
extract()

从ZIP文件中解压缩单个文件或目录。

  • 参数1:解压缩对象,传入字符串必须匹配namelist()返回的字符串列表中的一个
  • 参数2:将文件解压缩到指定的文件夹,而不是当前工作目录。如果指定的文件夹不存在,就会创建

3、创建和添加到ZIP文件

1)创建

以"w"模式打开ZipFile对象,使用write()方法压缩,该方法有两个参数:

  • 参数1:指定需要压缩文件的路径
  • 参数2:指定压缩算法,常用zipfile.ZIP_DEFLATED

注意,write()方法在处理文件夹路径时只会创建一个空的文件夹条目,并不会自动递归地压缩文件夹内的所有内容。

2)添加

"a"模式打开ZipFile对象

exampleZip = zipfile.ZipFile(r'open.zip',"w")
print(exampleZip.namelist())
exampleZip.write(r"E:\example\spam.txt",compress_type=zipfile.ZIP_DEFLATED)
exampleZip.close()

如果想将一个目录中所有内容全部压缩,用os.walk()来遍历文件夹结构并手动添加每个文件:

with zipfile.ZipFile('new.zip', 'w') as newZip:
    for foldername, subfolders, filenames in os.walk(r"E:\example"):
        for filename in filenames:
            file_path = os.path.join(foldername, filename)
            newZip.write(file_path, compress_type=zipfile.ZIP_DEFLATED)

;