组织文件
一、shutil模块与os模块
shutil模块主要功能为目录和文件操作以及压缩操作。对单个文件的操作也可参见os模块。
注意即便是更高级别的文件复制函数(shutil.copy(),shutil.copy2())也不能复制所有文件的元数据。这意味着在POSIX平台上,文件的所有者和组以及访问控制列表都将丢失。在Mac OS中资源fork和其他元数据无法使用。这意味着资源将丢失,文件类型和创建者代码将不正确。在Windows上,文件所有者,ACL和备用数据流不会被复制。
1.1 复制文件和文件夹
1.1.1 文件:shutil.copyfileobj(),shutil.copyfile(),shutil.copy()
copy(),copyfile()复制文件内容、权限和部分元数据
- 1、shutil.copyfileobj(fsrc, fdst[, length]):模块底函数层,复制文件内容(不包含元数据)从类文件对象src到文件对象对dst。可选参数length指定缓冲区的大小,负数表示一次性读入。默认会把数据切分成小块拷贝,以免占用太多内存。注意:拷贝是从fsrc的当前文件开始。
- 2、shutil.copyfile(src, dst):复制src文件到dst所在文件夹下(不包含元数据),并以dst命名,所以参数src和dst须是完整的字符串形式的路径名"路径+文件名"。实际是调用了底函数层copyfileobj(),如果src和dst是同一文件,就会引发错误shutil.Error。dst路径下必须是可写的,否则将引发异常IOError。如果dst已经存在,它会被替换。特殊文件,例如字符或块设备和管道不能使用此功能,因为copyfile会打开并阅读文件。
import shutil
shutil.copyfile(r'C:\Users\Administrator\Desktop\HELLO\Hello.txt',r'C:\Users\Administrator\Desktop\123.txt')
- 3、shutil.copy(data, destination):复制文件到新文件夹,同时返回复制后文件的路径字符串,两个参数须是字符串。
data必须是文件名称,如果destination是:
1)单单一个文件的名称(‘hello_1.txt’),不会出错,返回新文件的名称,但未确定复制到何处,无意义。
2)路径+文件的名称(‘C:\Users\Administrator\Desktop\hello_1.txt’),则将data文件复制到destination文件夹下,同时命名为destination。
3)文件夹路径,则将data文件复制到destination文件夹下,使用src相同的文件名创建(或覆盖),权限位也会复制。若destination文件夹不存在,则自动生成该文件。
import shutil
print(shutil.copy('C:\\Users\\Administrator\\Desktop\\Hello.txt','hello_1.txt'))
>hello_1.txt
print(shutil.copy('C:\\Users\\Administrator\\Desktop\\Hello.txt','C:\\Users\\Administrator\\Desktop\\hello_1.txt'))
>C:\Users\Administrator\Desktop\hello_1.txt #已复制到新文件夹
1.1.2 文件夹:shutil.copy2(),shutil.copytree()
shutil.copy2()复制文件夹内容、权限、大部分元数据(需平台支持),本质是调用了copyfile()和copystat()
shutil.copytree()递归复制目录,默认使用copy2(),带有更多的元数据复制
- 1、shutil.copy2(fsrc, fdst[, length]):类似shutil.copy,元数据也复制,实际上先调用shutil.copy(),然后使用copystat()。这类似于Unix命令cp -p。
- 2、shutil.copytree(oldpath, newpath, ignore= shutil.ignore_patterns(".xls", ".doc")):复制oldpath下的内容到newpath下,且newpath目录不能存在,忽略ignore参数下的文件,同时返回newpath的路径字符串
import shutil
print(shutil.copytree(r'C:\Users\Administrator\Desktop\\HELLO',r'C:\Users\Administrator\Desktop\\123'))
>C:\Users\Administrator\Desktop\\123
1.2拷贝文件元数据
1.2.1 shutil.copymode(),shutil.copystat()
- shutil.copymode(src, dst[):从src复制权限位到dst。该文件的内容,所有者和组不受影响。src和dst的是字符串形式的路径名。
- shutil.copystat(src, dst[):从src复制权限位,最后访问时间,最后修改时间,flag到dst。该文件的内容,所有者和组不受影响。 src和dst的是给定的字符串路径名。
1.3文件和文件夹的移动和改名
1.3.1 shutil.move()
- shutil.move(source, destination):将路径source处的文件移动到路径destination,并返回新位置的绝对路径的字符串。
1、如果destination存在,且指向一个文件夹,source文件将移动到destination中,并保持原来的文件名,如果destination文件夹内存在一个文件与source文件同名,将被覆写。
2、如果destination存在,且指向一个文件名,source文件将移动到destination所在文件夹下,并改名为destination的文件名。
3、如果destination不存在,且指向一个文件夹,source文件变成名为destination的文件。
1.4永久删除文件和文件夹
利用os模块中的函数,可以删除一个文件或一个空文件夹。但利用shutil模块,可以删除一个文件夹及其所有的内容。
1.4.1 shutil.rmtree()
shutil.rmtree(path)将删除path处的文件夹,它包含的所有文件和文件夹都会被删除
os.unlink(path)将删除path处的文件
os.rmdir(path)将删除path处的文件夹。该文件夹必须为空,其中没有任何文件和文件夹
1.5安全删除文件和文件夹,移动到回收站
1.5.1 send2trash模块
import send2trash
send2trash.send2trash('bacon.txt')
1.6 遍历目录树
1.6.1 os.walk()函数
可用于对某个文件夹中的所有文件改名,包括该文件夹中所有子文件夹中的所有文件
os.walk()函数被传入一个字符串值,即一个文件夹的路径。在一个for循环语句中使用os.walk()函数,遍历目录树,就像使用range()函数遍历一个范围的数字一样。不像range(),os.walk()在循环的每次迭代中,返回3个值:1.当前文件夹名称的字符串。
2.当前文件夹中子文件夹的字符串的列表。
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('')
>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模块
2.1 读取ZIP文件
要读取ZIP文件的内容,首先必须创建一个ZipFile对象(请注意大写首字母Z和F)。ZipFile对象在概念上与File对象相似
ZipFile对象的namelist()方法,返回ZIP文件中包含的所有文件和文件夹的字符串的列表,这些字符串可以传递给ZipFile对象的getinfo()方法,返回一个关于特定文件的ZipInfo对象。
ZipInfo对象有自己的属性,诸如表示字节数的file_size和compress_size,它们分别表示原来文件大小和压缩后文件大小。
ZipFile对象表示整个归档文件,而ZipInfo对象则保存该归档文件中每个文件的有用信息。
import zipfile, os
example = zipfile.ZipFile(r'C:\Users\Administrator\Desktop\Desktop.zip')
print(example.namelist())
spamInfo = example.getinfo('HELLO1.txt')
print(spamInfo.file_size)
print(spamInfo.compress_size)
>['HELLO/Hello.txt', 'HELLO1.txt', 'HELLO/']
>12
>12
2.2 从ZIP文件中解压缩
2.2.1 ZipFile对象的extractall()方法
默认解压缩到原目录下,如果向extractall()传递的一个文件夹名称,文件将解压缩到指定文件夹,如果传递给extractall()方法的文件夹不存在,文件夹会被创建。
example.extractall()
2.2.2 ZipFile对象的extract()方法
从ZIP文件中解压缩单个文件。传递给extract()的字符串,必须匹配namelist()返回的字符串列表中的一个。或者,你可以向extract()传递第二个参数,将文件解压缩到指定的文件夹,而不是当前工作目录。如果第二个参数指定的文件夹不存在,Python就会创建它。extract()的返回值是被压缩后文件的绝对路径。
example.extract('spam.txt')
exampleZip.extract('spam.txt', 'C:\\some\\new\\folders')
>'C:\\some\\new\\folders\\spam.txt'
2.3 创建和添加到ZIP文件
要创建压缩ZIP文件,必须以“写模式”打开ZipFile对象,即传入’w’作为第二个参数(类似向open()函数传入’w’,以写模式打开一个文本文件)
如果向ZipFile对象的write()方法传入一个路径,Python就会压缩该路径所指的文件,将它加到ZIP文件中。write()方法的第一个参数是一个字符串,代表要添加的文件名。第二个参数是“压缩类型”参数,它告诉计算机使用怎样的算法来压缩文件。可以总是将这个值设置为zipfile.ZIP_DEFLATED(这指定了deflate压缩算法,它对各种类型的数据都很有效)。
import zipfile
newZip = zipfile.ZipFile('new.zip', 'w')
newZip.write('C:\\spam.txt', compress_type=zipfile.ZIP_DEFLATED)
newZip.close()