python组织文件

shutil模块

python中的shutil模块中包含一些函数,可以复制、移动、改名和删除文件。

复制文件和文件夹

调用shutil.copy(source, destination),将路径source 处的文件复制到路径destination处的文件夹(source 和destination 都是字符串)。如果destination 是一个文件名,它将作为被复制文件的新名字。该函数返回一个字符串,表示被复制文件的路径。

>>> import shutil, os
>>> os.chdir('C:\\')
>>> shutil.copy('C:\\spam.txt', 'C:\\delicious')
'C:\\delicious\\spam.txt'
>>> shutil.copy('eggs.txt', 'C:\\delicious\\eggs2.txt')
'C:\\delicious\\eggs2.txt'

调用shutil.copytree(source, destination),将路径source 处的文件夹,包括它的所有文件和子文件夹,复制到路径destination 处的文件夹。source 和destination 参数都是字符串。该函数返回一个字符串,是新复制的文件夹的路径。

>>> import shutil, os
>>> os.chdir('C:\\')
>>> shutil.copytree('C:\\bacon', 'C:\\bacon_backup')
'C:\\bacon_backup'

shutil.copy()复制的是一个文件,而shutil.copytree()将复制整个文件夹,以及它包含的文件夹和文件。

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

调用shutil.move(source, destination),将路径source 处的文件夹移动到路径destination,并返回新位置的绝对路径的字符串。如果destination 指向一个文件夹,source 文件将移动到destination 中,并保持原来的文件名。

>>> import shutil
>>> shutil.move('C:\\bacon.txt', 'C:\\eggs')
'C:\\eggs\\bacon.txt'

destination 路径也可以指定一个文件名。在下面的例子中,source 文件被移动并改名。

>>> shutil.move('C:\\bacon.txt', 'C:\\eggs\\new_bacon.txt')
'C:\\eggs\\new_bacon.txt'

永久删除文件和文件夹

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

  1. 用os.unlink(path)将删除path 处的文件。
  2. 调用os.rmdir(path)将删除path 处的文件夹。该文件夹必须为空,其中没有任何文件和文件夹。
  3. 调用shutil.rmtree(path)将删除path 处的文件夹,它包含的所有文件和文件夹都会被删除。
    在第一次运行程序时,可以先注释掉这些删除调用,并且加上print()调用,显示会被删除的文件,以免删除错误。

用send2trash模块安全删除

send2trash()会将文件夹和文件发送到计算机的垃圾箱或回收站,而不是永久删除它们。如果因程序缺陷而用send2trash 删除了某些你不想删除的东西,稍后可以从垃圾箱恢复。这比Python 常规的删除函数要安全得多。

>>> import send2trash
>>> baconFile = open('bacon.txt', 'a') # creates the file
>>> baconFile.write('Bacon is not a vegetable.')
25
>>> baconFile.close()
>>> send2trash.send2trash('bacon.txt')

一般来说,总是应该使用send2trash.send2trash()函数来删除文件和文件夹。虽然它将文件发送到垃圾箱,但是不会释放磁盘空间。如果希望程序释放磁盘空间,就要用os 和shutil 来删除文件和文件夹。send2trash()函数只能将文件送到垃圾箱,不能从中恢复文件。

遍历目录树

可以在一个for循环语句中使用os.walk()函数,遍历目录树,就像使用range()函数遍历一个范围的数字一样。不像range(),os.walk()在循环的每次迭代中,返回3 个值:

  1. 当前文件夹名称的字符串。
  2. 当前文件夹中子文件夹的字符串的列表。
  3. 当前文件夹中文件的字符串的列表。
    所谓当前文件夹,是指for 循环当前迭代的文件夹。程序的当前工作目录,不会因为os.walk()而改变。
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('')

The current folder is C:\delicious
SUBFOLDER OF C:\delicious: cats
SUBFOLDER OF C:\delicious: walnut
FILE INSIDE C:\delicious: spam.txt

The current folder is C:\delicious\cats
FILE INSIDE C:\delicious\cats: catnames.txt
FILE INSIDE C:\delicious\cats: zophie.jpg

The current folder is C:\delicious\walnut
SUBFOLDER OF C:\delicious\walnut: waffles

The current folder is C:\delicious\walnut\waffles
FILE INSIDE C:\delicious\walnut\waffles: butter.txt.

文件压缩

利用zipfile 模块中的函数,Python 程序可以创建和打开(或解压)ZIP 文件。

读取zip文件

调用zipfile.ZipFile()函数会创建一个ZipFile对象,传入字符串参数,表示.zip 文件的文件名。zipfile 是Python 模块的名称,ZipFile()是函数的名称。

>>> import zipfile, os
>>> os.chdir('C:\\') # move to the folder with example.zip
>>> exampleZip = zipfile.ZipFile('example.zip')
>>> exampleZip.namelist()
['spam.txt', 'cats/', 'cats/catnames.txt', 'cats/zophie.jpg']
>>> spamInfo = exampleZip.getinfo('spam.txt')
>>> spamInfo.file_size
13908
>>> spamInfo.compress_size
3828
>>> 'Compressed file is %sx smaller!' % (round(spamInfo.file_size / spamInfo.compress_size, 2))
'Compressed file is 3.63x smaller!'
>>> exampleZip.close()

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

从zip文件中解压缩

ZipFile 对象的extractall()方法从ZIP 文件中解压缩所有文件和文件夹,放到当前工作目录中。或者,可以向extractall()传递一个文件夹名称,它将文件解压缩到那个文件夹,而不是当前工作目录。如果传递给extractall()方法的文件夹不存在,它会被创建。
ZipFile 对象的extract()方法从ZIP 文件中解压缩单个文件

创建和添加到zip文件

要创建压缩ZIP 文件,必须以“写模式”打开ZipFile 对象,即传入’w’作为第二个参数(类似于向open()函数传入’w’,以写模式打开一个文本文件)。
如果向ZipFile 对象的write()方法传入一个路径,Python 就会压缩该路径所指的文件,将它加到ZIP 文件中。write()方法的第一个参数是一个字符串,代表要添加的文件名。第二个参数是“压缩类型”参数,它告诉计算机使用怎样的算法来压缩文件,可以将这个值设置为zipfile.ZIP_DEFLATED。

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

需要记住的是,就像写入文件一样,写模式将擦除ZIP 文件中所有原有的内容。如果只是希望将文件添加到原有的ZIP 文件中,就要向zipfile.ZipFile()传入’a’作为第二个参数,以添加模式打开ZIP 文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值