@zhangyu756897669
2017-09-16T15:48:55.000000Z
字数 3441
阅读 554
python官方文档
假设您要重命名某个文件夹中的每个文件以及该文件夹的每个子文件夹中的每个文件。也就是说,你想通过目录树,触摸每个文件,当你走。写一个程序来做这个可能会变得棘手;幸运的是,Python为您提供了一个处理此过程的功能。
这是一个使用图9-1所示的目录树上的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('')
os.walk()函数传递一个字符串值:文件夹的路径。您可以在for循环语句中使用os.walk()来执行目录树,就像您可以使用range()函数来遍历一系列数字一样。与range()不同,os.walk()函数将通过循环在每次迭代中返回三个值:
(当前文件夹,我的意思是for循环当前迭代的文件夹,程序的当前工作目录不会被os.walk()更改)
就像您可以在范围(10)中的i的代码中选择变量名称i,您还可以选择前面列出的三个值的变量名称。我通常使用名称文件夹名,子文件夹和文件名。
The current folder is C:\delicious
SUBFOLDER OF C:\delicious: cats
SUBFOLDER OF C:\delicious: walnut
FILE INSIDE C:\delicious: spam.txtThe current folder is C:\delicious\cats
FILE INSIDE C:\delicious\cats: catnames.txt
FILE INSIDE C:\delicious\cats: zophie.jpgThe current folder is C:\delicious\walnut
SUBFOLDER OF C:\delicious\walnut: wafflesThe current folder is C:\delicious\walnut\waffles
FILE INSIDE C:\delicious\walnut\waffles: butter.txt.
由于os.walk()返回子文件夹和文件名变量的字符串列表,您可以在自己的for循环中使用这些列表。用您自己的自定义代码替换print()函数调用。 (或者如果您不需要一个或两个,请删除for循环。)
您可能熟悉ZIP文件(具有.zip文件扩展名),可以保存许多其他文件的压缩内容。压缩文件减小其大小,这在通过Internet传输时非常有用。而且由于ZIP文件还可以包含多个文件和子文件夹,因此将多个文件打包到一个文件中是一种方便的方法。这个名为档案文件的单个文件可以说是附加在电子邮件上。
您的Python程序可以使用zipfile模块中的功能创建和打开(或提取)ZIP文件。假设你有一个名为example.zip的ZIP文件,其内容如图9-2所示。
您可以从http://nostarch.com/automatestuff/下载此ZIP文件,也可以使用计算机上已有的ZIP文件。
要读取ZIP文件的内容,首先必须创建一个ZipFile对象(注意大写字母Z和F)。 ZipFile对象在概念上类似于上一章中open()函数返回的File对象:它们是程序与文件交互的值。要创建ZipFile对象,请调用zipfile.ZipFile()函数,传递一个.zip文件的文件名。需要注意的是zip文件是Python模块的名称,并的ZipFile()是函数的名称。
import zipfile, os
os.chdir('C:\\') # move to the folder with example.zip
exampleZip = zipfile.ZipFile('example.zip')
exampleZip.namelist()
要读取ZIP文件的内容,首先必须创建一个ZipFile对象(注意大写字母Z和F)。 ZipFile对象在概念上类似于上一章中open()函数返回的File对象:它们是程序与文件交互的值。要创建ZipFile对象,请调用zipfile.ZipFile()函数,传递一个.zip文件的文件名。需要注意的是zip文件是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文件中包含的所有文件和文件夹的字符串列表。这些字符串可以传递给getinfo()ZipFile方法来返回关于该特定文件的ZipInfo对象。 ZipInfo对象有自己的属性,如file_size和compress_size(以字节为单位),分别保存原始文件大小和压缩文件大小的整数。 ZipFile对象表示整个存档文件时,ZipInfo对象保存有关存档中单个文件的有用信息。
❶中的命令通过将原始文件大小除以压缩文件大小来计算example.zip是否被压缩,并使用格式为%s的字符串打印此信息。
ZipFile对象的extractall()方法将所有文件和文件夹从ZIP文件中提取到当前工作目录中。
import zipfile, os
os.chdir('C:\\') # move to the folder with example.zip
exampleZip = zipfile.ZipFile('example.zip')
exampleZip.extractall()
exampleZip.close()
运行此代码后,将会将example.zip的内容提取到C:\。或者,您可以将文件夹名称传递给extractall(),以将文件解压缩到除当前工作目录之外的文件夹中。如果传递给extractall()方法的文件夹不存在,则会被创建。例如,如果您使用exampleZip.extractall('C:\ delicious')替换了❶的调用,代码将从example.zip中将文件解压缩到新创建的C:\ delicious文件夹中。
ZipFile对象的extract()方法将从ZIP文件中提取单个文件。
exampleZip.extract('spam.txt')
'C:\spam.txt'
exampleZip.extract('spam.txt', 'C:\\some\\new\\folders')
'C:\some\new\folders\spam.txt'
exampleZip.close()
您传递给extract()的字符串必须与namelist()返回的列表中的一个字符串相匹配。或者,您可以将第二个参数传递给extract(),将文件解压缩到当前工作目录以外的文件夹中。如果第二个参数是一个尚不存在的文件夹,Python将创建该文件夹。 extract()返回的值是提取文件的绝对路径。