20220803python学习
Published on 2022-08-03 21:04 in 分类: 02.编程语言 / 01.Python with Diligent_Maple

20220803python学习

本篇文章代码来自《Python编程快速上手——让繁琐工作自动化》

第10章:组织文件

shutil模块

该模块可以让你在Python程序中复制、移动、重命名和删除文件。

复制文件和文件夹

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

1
2
3
4
5
6
7
>>> import shutil, os
>>> from pathlib import Path
>>> p = Path.home()
>>> shutil.copy(p/'spam.txt', p/'some_folder')
'C:\\Users\\Xfsadmin\\some_folder\\spam.txt'
>>> shutil.copy(p/'eggs.txt', p/'some_folder/eggs2.txt')
WindowsPath('C:/Users/Xfsadmin/some_folder/eggs2.txt')

第一个shutil.copy()方法将文件C:\Users\Xfsadmin\spam.txt复制到文件夹C:\Users\Xfsadmin\some_folder。返回值是刚刚被复制的文件的路径。请注意,因为只是指定了一个文件夹作为目的地,所以原来的文件名spam.txt就被用作新复制的文件名。第二个shutil.copy()方法也将C:\Users\Xfsadmin\eggs.txt复制到文件夹C:/Users/Xfsadmin/some_folder/,但因为新文件提供了一个名字eggs2.txt。

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

1 >>> import shutil, os
2 >>> from pathlib import Path
3 >>> p = Path.home()
4 >>> shutil.copytree(p/'spam', p/'spam_back')
5 WindowsPath('C:/Users/Xfsadmin/spam_back')

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

调用shutil.move(source, destination),将路径source处的文件夹移动到路径destination,并返回新位置的绝对路径的字符串。

如果destination指向一个文件夹,那么source文件将移动到destination中,并保持原来的文件名。

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

如果在C:\目录中已存在一个名为eggs的文件夹,调用shutil.move()方法就是将C:\bacon.txt移动到文件夹C:\eggs中。

如果在C:\eggs中已经存在一个文件bacon.txt,那么它就会被覆盖。

最后,构成目的地的各层级目录必须已经存在,否则Python会抛出异常。

永久删除文件和文件夹

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

  • 调用os.unlink(path)将删除path处的文件,文件会被永久删除。

  • 调用os.rmdir(path)将删除path处的文件夹。该文件夹必须为空,其中不能有任何文件和文件夹。

  • 调用shutil.rmtree(path)将删除path处的文件夹,它包含的所有文件和文件夹都会被删除。

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

现在os.unlink()调用被注释掉,因此python会忽略它。作为代替,输出将被删除的 文件名。先运行这个版本的程序,防止错误删除文件。

用send2trash模块安全地删除

因为Python内置的shutil.rmtree()函数将不可恢复地删除文件和文件夹,所有用起来很危险。删除文件和文件夹更好的方法是使用第三方的send2trash模块。

利用send2trash比用Python常规的删除函数要安全得多,因为它会将文件夹和文件发送到计算机的回收站,而不是永久删除它们。

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

一般来说,总是应该使用send2trash.send2trash()函数来删除文件和文件夹,它将文件发送到回收站,让你能够恢复文件,但这不像是永久删除文件,它不会释放磁盘空间。如果你希望程序释放磁盘空间,就要使用os和shutil来删除文件和文件夹。请注意,send2trash()函数只能将文件发送到回收站,不能从中恢复文件。

遍历目录树

复制代码
import os
​
for folderName, subfolders, filenames in os.walk('C:\\IsompSSO'):
    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.wakl()函数被传入一个字符串值,即一个文件夹的路径。你可以在一个for循环语句中使用os.wale()函数遍历目录树,就像使用range()函数遍历某个范围的数字一样。不像range(),os,walk()在循环的每次迭代中返回以下3个值:

  • 当前文件夹名称的字符串。

  • 当前文件夹中子文件夹的字符串的列表。

  • 当前文件夹中文件的字符串的列表。

所谓当前文件夹,是指for循环时迭代的文件夹。程序的当前目录不会因为os.walk()而改变。

用zipfile模块压缩文件

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

读取ZIP文件

要读ZIP文件的内容,首先必须创建一个ZipFile对象(请注意大写首字符Z和F)。要创建一个ZipFile对象,就要调用zipfile.ZipFile()函数,向它传入一个字符串,表示ZIP文件的文件名。请注意,zipfile是Python模块的名称,ZipFile()是函数的名称。

复制代码
>>> import zipfile, os
​
>>> from pathlib import Path
>>> p = Path.home()
>>> exampleZip = zipfile.ZipFile(p/'test.zip')
>>> exampleZip.namelist()
['test/', 'test/3.txt', 'test/4.txt', 'test/cc/', 'test/cc/1.txt', 'test/cc/2.txt']
>>> spamInfo = exampleZip.getinfo('test/3.txt')
>>> spamInfo.file_size
0
>>> spamInfo.compress_size
0
>>> f'Compressed file is {round(spamInfo.file_size / spamInfo.compress_size, 2)}x smaller!'
'Compressed file is 1.0x smaller!'
>>> exampleZip.close()
复制代码

 

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

从ZIP文件中解压缩

ZipFile对象的extractall()方法从ZIP文件中解压所有文件和文件夹,并将其放到当前工作目录中:

>>> import zipfile, os
>>> from pathlib import Path
>>> p = Path.home()
>>> exampleZip = zipfile.ZipFile(p/'example.zip')
>>> exampleZip.extractall()
>>> exampleZip.close()

 

exmple.zip的内容将被解压缩到C:\。或者你可以向extractall()传递一个文件夹名称,它将文件解压缩倒那个文件夹,而不是当前工作目录。

ZipFile对象的extract()方法从ZIP文件中解压缩单个文件。

>>> exampleZip.extract('spam.txt')
'C:\\spam.txt'
>>> exampleZip.extract('spam.txt', 'c:\\some\\name\\folders')
'C:\\some\\folders\\spam.txt'
>>> exampleZip.close()

 

创建和添加到ZIP文件

要创建你自己的压缩ZIP文件,必须以“写模式”打开ZipFile对象,即传入'w'作为第二个参数。

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

第一个参数是一个字符串,代表要添加的文件名。第二个参数是“压缩类型”参数,它告诉计算机使用怎样的算法来压缩文件。

 

posted @   Diligent_Maple  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示