第九章 组织文件

前言

展示python如何用比手工更快的速度,复制、移动、重命名和删除大量的文件,解释压缩和解压缩文件。

上一章学习如何用python创建并写入新文件。你的程序也可以组织硬盘上存在的文件。shutil(或称为shell工具)模块包含一些函数,可以实现在python程序中复制,移动,改名和删除文件。如需使用,要import。调用shutil.copy(source,destination),将路径source处的文件复制到destination处的文件夹。如果destination是一个文件名,它将作为被复制文件的新名字。该函数返回一个字符串,表示被复制文件的路径。例子如下:

import shutil,os
os.chdir('.')
print(shutil.copy('.\\spam.txt','.\\delicious'))
print(shutil.copy('.\\eggs.txt','delicious\\eggs2.txt'))
结果:
.\delicious\spam.txt
delicious\eggs2.txt

shutil.copy()是复制一个文件,shutil.copytree()将复制整个文件夹,以及它所包含的文件夹和文件。返回值是新复制的文件夹的路径。调用它会创建一个新文件夹。

print(shutil.copytree('delicious','delicious_backup'))
结果
delicious_backup

调用shutil.move(source,destination),将路径source处的文件夹移动到路径destination处,并返回新位置的绝对路径的字符串。注意容易出现覆写情况。

调用os.unlink(path)将删除path处的文件。

调用os.rmdir(path)将删除path处的文件夹,该文件夹必须为空。

调用shutil.rmtree(path)将删除path处的文件夹,它包含的所有文件和文件夹都会被删除。该函数不可恢复的删除文件和文件夹,所以用起来很危险。更好的方法是使用第三方的send2trash模块。在终端运行pip install send2trash,安装该模块。利用send2trash会将文件夹和文件发送到计算机的垃圾箱或回收站,而不是永久删除。例子如下:

import send2trash
baconFile = open('bacon.txt','a')
print(baconFile.write('Bacon is not a vegetable.'))
baconFile.close()
send2trash.send2trash('bacon.txt')

运行上述代码会将创建的bacon.txt文件发送到回收箱,这不会释放磁盘空间,如需要应该使用os和shutil来删除。

如果你希望对某个文件夹中的所有文件改名,包括该文件夹中所有子文件夹中的所有文件,需要遍历目录树,处理遇到的每个文件。例子如下:

import os
for folderName,subFolders,filenames in os.walk('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('')
结果
The current folder is delicious
Subfolder of delicious:cats
Subfolder of delicious:walnut
File inside delicious:eggs2.txt
File inside delicious:spam.txt

The current folder is delicious\cats
File inside delicious\cats:catnames.txt
File inside delicious\cats:zophie.docx

The current folder is delicious\walnut
Subfolder of delicious\walnut:waffes

The current folder is delicious\walnut\waffes
File inside delicious\walnut\waffes:spam.txt

以上结果是根据自己建立的文件夹目录有关,可以自己尝试先建立自己的文件夹目录。

os.walk()在循环的每次迭代中,返回三个值:当前文件夹名称的字符串;当前文件夹中子文件夹的字符串列表;当前文件夹中文件的字符串列表。

ZIP文件(带有.zip文件扩展名),它可以包含许多其他文件的压缩内容。将多个文件打包成一个文件,叫做“归档文件”。利用zipfile模块中的函数,python程序可以创建和打开(或解压)ZIP文件。

要读取ZIP文件的内容,首先需要创建一个ZipFile对象,需调用zipfile.ZipFile()函数,向它传入一个字符串,即.zip文件的文件名。这里请注意,zipfile是python模块的名称,ZipFile()是函数的名称。例子如下:

import zipfile,os
exampleZip = zipfile.ZipFile('delicious.zip')
print(exampleZip.namelist())
spamInfo = exampleZip.getinfo('delicious/eggs2.txt')
print(spamInfo.file_size)
print(spamInfo.compress_size)
exampleZip.close()
结果
['delicious/', 'delicious/cats/', 'delicious/cats/catnames.txt', 'delicious/cats/zophie.docx', 'delicious/eggs2.txt', 'delicious/spam.txt', 'delicious/walnut/', 'delicious/walnut/waffes/', 'delicious/walnut/waffes/spam.txt']
74
75

ZipFile对象有一个namelist()方法,返回ZIP文件包含的所有文件和文件夹的字符串列表,这些字符串传给ZipFile对象的getinfo()方法,返回一个关于特定文件的ZipInfo对象,比如表示字节数的file_size和compress_size,表示原来文件大小和压缩后文件大小。注意,ZipFile对象表示整个归档文件,而ZipInfo对象则保存该归档文件中每个文件的有用信息。

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

import zipfile
exampleZip = zipfile.ZipFile('delicious.zip')
exampleZip.extractall()
exampleZip.close()

运行上述代码,压缩包将被解压到当前目录。也可以给extractall()传递一个参数,将文件解压到该文件夹,如果参数的文件名不存在,会创建一个。也可以解压缩单个文件,使用extract(),其中参数是待解压的单个文件,它的返回值是被解压缩文件的绝对路径。

也可以进行压缩操作,例子如下:

import zipfile
newZip = zipfile.ZipFile('new.zip','w')
newZip.write('spam.txt',compress_type=zipfile.ZIP_DEFLATED)
newZip.close()

运行上述代码就会将spam.txt文件压缩成new.zip。注意:写模式会擦除ZIP文件中所有原来的内容,如果只是希望将文件添加到源有的ZIP文件中,传入’a’作为第二个参数,以添加模式打开ZIP文件。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值