Python中可以用於對檔案和目錄進行操作的內建模組包括:
##功能描述open()函數檔案讀取或寫入os.path模組#檔案路徑操作os模組檔案與目錄簡單操作zipfile模組檔案壓縮tarfile模組檔案包裝#shutil模組進階檔案與目錄處理fileinput模組讀取一個或多個檔案中的所有行tempfile模組建立臨時檔案和目錄#模組/函數名稱 | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
|
2. 實例注意: os.path.basename(path)函數與Unix 中的basename程式的不同之處在於,當path以路徑分隔符號結尾時(如'/usr/local/'),basename(path)回傳值為空字串(''),而basename程式回傳值為倒數第二個路徑分隔符號之後的目錄名稱('local')
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
|
在某些Unix平台上,這個模組的許多檔案或目錄的操作函數都支援下面的一個或多個特性:需要說明的是: os模組是一個混雜的作業系統介面模組,它提供了各種作業系統相關的功能,檔案及目錄操作只是其中一部分,而非全部。
指定一個檔案描述子 對於某些函數,path參數不只可以是一個字串,還可以是一個檔案描述子。這個函數會操作這個檔案描述符所引用的檔案。我們可以透過os.supports_fd來檢查目前平台path參數是否可以指定為一個檔案描述符,如果不可用將會引發一個NotImplementedError。如果函數也支援dir_fd或follow_symlinks參數,當path被以文件描述符的方式提供時,指定dir_fd或follow_symlinks參數是錯誤的。
相對於目錄描述符的路徑 如果dir_fd不是None,它應該是指向某個目錄的檔案描述符,並且要操作的path應該是相對於該目錄的相對路徑;如果path是一個絕對路徑,dir_fd將會被忽略。
不遵循符號連結 如果follow_symlinks是False,並且要操作的路徑中最後一個元素是符號連結時,函數將會操作這個連結文件,而不是操作這個連結文件所指向的文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
|
#關於os.access()函數的說明:預設以使用者的真實uid(RUID)和gid來對文件的存取權限做檢測,但是大部分操作將會使用有效uid(EUID)或gid去做檢測,且Python3中可以透過將effective_ids參數設定為Ture來使用有效uid/ gid來做權限偵測(關於RUID/EUID/SUID的概念可以參考<>)。 mode可取值為:os.F_OK(檔案存在)、os.R_OK(可讀)、os.W_OK(可寫入)、os.X_OK(可執行)中的一個或用邏輯運算子連接起來的多個。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
|
zipfile.ZipInfo類別的實例可以透過ZipFile物件的getinfo()和infolist()方法來取得。
#函數/常數名稱 | 描述 |
---|---|
zipfile.is_zipfile(filename) | 判斷filename是否是有效的ZIP文件,並且傳回一個布林類型的值 |
zipfile.ZIP_STORED | 表示一個壓縮的歸檔成員 |
zipfile.ZIP_DEFLATED | 表示普通的ZIP壓縮方法,需要zlib模組的支援 |
zipfile.ZIP_BZIP2 | 表示BZIP2壓縮方法,需要bz2模組的支援;Python3.3新增 |
zipfile.ZIP_LZMA | 表示LZMA壓縮方法,需要lzma模組的支援;Python3.3新增 |
1 |
|
创建一个ZipFile实例,表示打开一个ZIP文件。
参数:
file:可以是一个文件的路径(字符串),也可以是一个file-like对象;
mode:表示文件代开模式,可取值有:r(读), w(写), a(添加), x(创建和写一个唯一的新文件,如果文件已存在会引发FileExistsError)
compression:表示对归档文件进行写操作时使用的ZIP压缩方法,可取值有:ZIP_STORED, ZIP_DEFLATED, ZIP_BZIP2, ZIP_LZMA, 传递其他无法识别的值将会引起RuntimeError;如果取ZIP_DEFLATED, ZIP_BZIP2, ZIP_LZMA,但是相应的模块(zlib, bz2, lzma)不可用,也会引起RuntimeError;
allowZip64:如若zipfile大小超过2GiB且allowZip64的值为False,则将会引起一个异常
说明:
从Python 3.2开始支持使用ZipFile作为上下文管理器(with语法)
从Python 3.3开始支持bzip2和lzma压缩
从Python 3.4开始allowZip64默认值改为True
从Python 3.5开始添加对unseekable streams的写操作支持以及对‘x’ mode的支持
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
|
PyZipFile类用于创建包含Python库的ZIP存档
PyZipFile的构造方法与ZipFile的构造方法参数基本一致,只是多了一个optimize参数
1 |
|
说明:
Python 3.2 新增optimize参数
Python 3.4 allowZip64默认值改为True
PyZipFile类的实例方法与ZipFile类的实例方法一致,只是多了一个writepy()方法:
1 2 |
|
说明:
如果该PyZipFile实例的构造方法中的optimize参数没有被给出,或者被设置为-1,那么这里所指的“相应文件”是一个*.pyc文件,如果需要,会进行编译。
如果该PyZipFile实例的构造方法中的optimize参数值为0, 1或2,只有那些同样优化等级(参考compile()函数)的文件会被添加到归档文件。
如果pathname是一个文件,文件名必须以.py结尾,且仅仅是这些(*.py[co])文件被添加,不包含路径信息;如果pathname是一个文件,但是不以.py结尾,将会引发RuntimeError。
如若pathname是一个目录,且这个目录不是一个package目录,则所有的(不包含路径信息).py[co]文件将被添加;如果pathname是一个package目录,则所有的.py[co]都会作为一个文件路径被添加到这个package名称下,并且如果任何子文件夹是package目录,则会被递归添加。
basename仅供内部使用
filterfunc参数如果被给出,则其必须是一个只接收一个字符串参数的函数。每个文件路径在被添加到归档之前都会作为参数传递给filterfunc所指定的函数。如果filterfunc返回False,则这个路径将不会被添加,如果是一个目录,则它的内容将会被忽略。
filterfunc参数是Python 3.4新加的。
ZipInfo类的实例时通过ZipFile对象的getinfo()和infolist()方法返回的,其本身没有对外提供构造方法和其他方法。每一个ZipInfo对象存储的是ZIP归档文件中一个单独成员的相关信息,因此该实例仅仅提供了以下属性用于获取归档文件中成员的信息。
属性名称 | 描述 |
---|---|
ZipInfo.filename | 文件名称 |
ZipInfo.date_time | 文件的最后修改日期和时间,这是一个tuple:(年, 月, 日, 时, 分, 秒) |
ZipInfo.compress_type | 压缩类型 |
ZipInfo.comment | 文件备注 |
ZipInfo.extra | 扩展字段数据 |
ZipInfo.create_system | ZIP归档的创建系统 |
ZipInfo.create_version | 创建ZIP归档的PKZIP版本 |
ZipInfo.extract_version | 展开ZIP归档所需要的PKZIP版本 |
ZipInfo.reserved | 必须是0 |
ZipInfo.flag_bits | ZIP标志位 |
ZipInfo.volume | 文件头的Volume号码 |
ZipInfo.internal_attr | 内部属性 |
ZipInfo.external_attr | 外部属性 |
ZipInfo.header_offset | 文件头的字节偏移量 |
ZipInfo.CRC | 未压缩文件的CRC-32 |
ZipInfo.compress_size | 压缩后的数据大小 |
ZipInfo.file_size | 未压缩文件大小 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
工程目录结构
1 2 3 4 5 6 7 8 9 10 11 12 |
|
代码
1 2 3 4 5 6 7 8 9 10 |
|
输出结果:
1 2 3 4 5 6 |
|
tarfile模块用于读写tar归档文件,它也可以同时实现压缩功能。与zipfile模块相比,tarfile模块 可以直接将一个目录进行归档并压缩。另外,tarfile模块提供的api更“面向对象”化。
类名 | 描述 |
---|---|
TarFile | 该类提供了操作一个tar归档的接口 |
TarInfo | 一个TarInfo对象代表TarFile中的一个成员 |
这两个类的关系类似于zipfile.ZipFile与zipfile.ZipInfo的关系,TarInfo对象中保存了一个文件所需要的所有属性,比如:文件类型、文件大小、修改时间、权限、属主等,但是它不包含文件的数据。
方法/常量名 | 描述 |
---|---|
tarfile.open(name=None, mode='r', fileobj=None, bufsize=10240, **kwargs) | 为指定的路径名name返回一个TarFile对象 |
tarfile.is_tarfile(name) | 如果name是一个tarfile模块可以读的tar归档文件则返回True,否则返回False |
tarfile.ENCODING | 表示默认字符编码,在windows上为'utf-8',否则为sys.getfilesystemencoding()的返回值 |
tarfile.USTAR_FORMAT | POSIX.1-1922(ustar)格式 |
tarfile.GUN_FORMAT | GUN tar格式 |
tarfile.PAX_FORMAT | POSIX.1-2001(pax)格式 |
tarfile.DEFAULT_FORMAT | 表示创建归档的默认格式,当前值为GUN_FORMAT |
关于open()函数的说明:
1 |
|
该函数用于创建并返回一个TarFile对象。Python官方文档不建议直接使用TarFile的构造方法构建示例,而是建议使用这个open()函数来操作TarFile对象。下面我们来说说它的参数:
name:表示要创建的归档文件的名称,通常为.tar, .tar.gz, .tar.bz2, .tar.xz,具体后缀应该与mode的值对应
mode:必须是一个filemode[:compression]
格式的字符串,默认值为'r'。filemode的可取值为'r', 'w', 'a', 'x'; compression表示压缩方式,可取值为'gz', 'bz2', 'xz';需要注意的是'a:gz', 'a:bz2', 'a:xz'是不允许的格式。
下面是mode所有可取值的列表:
mode | 行为 |
---|---|
'r:' | 以读模式打开一个未压缩的归档文件(通常后缀为*.tar) |
'r:gz' | 以读模式打开一个通过gzip方式进行压缩的归档文件(通常后缀为*.tar.gz) |
'r:bz2' | 以读模式打开一个通过bzip2方式进行压缩的归档文件(通常后缀为*.tar.bz2) |
'r:xz' | 以读模式打开一个通过lzma方式进行压缩的归档文件(通常后缀为*.tar.xz) |
'r' 或 'r:*' | 以读模式打开归档文件,可以打开以上任意方式压缩的归档文件,且会自动判断应该使用的压缩方式。推荐使用这个mode。 |
'w'或'w:' | 以写模式打开一个不进行压缩的归档文件 |
'w:gz' | 以写模式打开一个以gzip方式进行压缩的归档文件 |
'w:bz2' | 以写模式打开一个以bzip2方式进行压缩的归档文件 |
'w:xz' | 以写模式打开一个以lzma方式进行压缩的归档文件 |
'x'或'x:' | 同'w'或'w:',但是如果归档文件已经存在会引发FileExistsError |
'x:gz' | 同'w:gz',但是如果归档文件已经存在会引发FileExistsError |
'x:bz2' | 同'w:bz2'',但是如果归档文件已经存在会引发FileExistsError |
'x:xz' | 同'w:xz',但是如果归档文件已经存在会引发FileExistsError |
'a'或'a:' | 以追加方式打开一个不进行压缩的股低昂文件,如果文件不存在则创建 |
对于 'w:gz', 'r:gz', 'w:bz2', 'r:bz2', 'x:gz', 'x:bz2'这些模式, tarfile.open() 接收关键字参数 compresslevel (默认值为9) 来指定该归档文件的压缩级别.
1 |
|
参数说明:
下面所有的参数都是可选的,且可以作为TarFile类实例的属性被访问;
name:指定归档文件路径名称;如果fileobj参数被指定该参数可以被忽略,且如果fileobj的name属性存在则取该属性的值;
mode::指定文档打开模式;r:读取已存在的归档,a:向一个已存在的文件追加数据,w:创建一个新的文件覆盖已经存在的文件,x:如果文件不存在才创建一个新文件
fileobj:指定要读写的文件对象;如果指定了该参数,那么mode参数的值会被fileojb的mode属性值覆盖,且name参数可以被忽略;
format:用于控制归档格式;必须是这些值中的一个:USTAR_FORMAT, GUN_FORMAT, PAX_FORMAT
tarinfo:
dereference:如果该参数值为False,则直接将软连接和硬链接添加到归档中;如果该参数值为True,则将目标文件的内容添加到归档中;
ignore_zeros:该参数值对读取连续或损坏的归档时有效;如果值为False,则会把一个空block当做归档文件的结束位置;如果值为Ture,则会跳过空或无效的block并尝试获取尽可能多的归档成员
debug:设置调试级别,可取值为0(不输出任何调试信息)至 3(输出所有调试信息),调试信息会被写到sys.stderr;
errorlevel:设置错误级别;如果值为0,则使用TarFile.extract()方法时出现的所有错误都会被忽略,否则,如果debug可用,这些信息会作为错误信息出现在debug输出中。如果值为1,则所有fatal错误将会引发OSError;如果值为2,则所有非fatal错误将会引发TarError;
encoding 和 errors:这两个参数定义了读写归档时使用的字符编码和如何处理转换错误
1 |
|
这是个可选的构造方法,实际上tarfile.open()函数就是这个函数的快捷方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
一个TarInfo对象表示TarFile中的一个成员。TarInfo对象中除了保存了一个文件所需要的所有属性(比如:文件类型、文件大小、修改时间、权限、属主等)之外,它还提供了一些用于判断其文件类型的方法。需要注意的是,它不包含文件的数据。TarInfo对象可以通过TarFile的getmember()、getmembers()和gettarinfo()方法获取。
1 |
|
1 2 3 4 5 |
|
方法/属性名 | 描述 |
---|---|
name | 归档成员名称 |
size | 字节大小 |
mtime | 最后更改时间 |
mode | 权限位 |
type | 文件类型,通常是以下几个常量中的一个:REGTYPE, AREGTYPE, LINKTYPE, SYMTYPE, DIRTYPE, FIFOTYPE, CONTTYPE, CHRTYPE, BLKTYPE, GUNTYPE_SPARSE。判断一个TarInfo对象类型的更方便的方式是使用下面的is*()方法 |
linkname | 目标文件名称,这只是在TarInfo对象的类型是LINKTYPE和SYMTYPE时有效 |
uid | 最初存储该成员的用户ID |
gid | 最初存储该成员的组ID |
uname | 用户名 |
gname | 组名 |
pax_headers | 一个包含pax扩展头的key-value字典 |
isfile() / isreg() | 判断TarInfo对象是否是一个普通文件 |
isdir() | 判断TarInfo对象是否是一个目录 |
issym() | 判断TarInfo对象是否是一个软链接 |
islnk() | 判断TarInfo对象是否是一个硬链接 |
ischr() | 判断TarInfo对象是否是一个字符设备 |
isblk() | 判断TarInfo对象是否是一个块设备 |
isfifo() | 判断TarInfo对象是否是一个FIFO管道 |
isdev() | 判断TarInfo对象是否是一个字符设备 或 块设备 或 FIFO管道 |
tobuf(format=DEFAULT_FORMAT, encoding=ENCODING, errors='surrogateescape') | 从一个TarInfo对象生成一个字符串缓冲区 |
工程目录结构:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Python工程归档及解压操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
上面我们介绍了路径操作(os.path模块)、文件和目录操作(os模块)和 文件归档压缩操作(zipfile模块和tarfile模块),但是还是这些模块要么缺少一些常用的功能(如:文件复制、删除非空文件夹),要么使用起来不是那么方便,而shutil模块shutil提供了一些文件和文件集合的高级操作,可以弥补这些不足。
需要注意的是:虽然shutil.copy()和shutil.copy2()是高级复制函数,但是它们并不能拷贝所有的文件元数据(metadata),例如在POSIX平台上,文件的属主、属组和ACLs等信息都会丢失。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
|
shutil模块的当当操作是创建和读取压缩文件的高级工具,同时提供文档归档功能。这些高级工具的实现是基于zipfile和tarfile模块实现的,其中与make_archive相关的函数是在Python 2.7版本新增的,而与unpack_archive相关的函数是在Python3.2版本新增的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
tempfile模块用于创建和操作临时文件;fileinput模块用于同时读取多个文件的内容(包括sys.stdin)。这两个模块比较简单,大家自己翻下官方文档就可以了。
使用os.path模块进行路径相关操作,如:路径分割,路径拼接,获取路径对应文件的大小、绝对路径、3个时间属性、目录名(dirname)和文件名(basename),判断路径对应文件的类型等;
使用os模块进行文件及目录相关基础操作,如:删除单个文件或空目录,设置文件或目录的权限和属主、属组,文件和目录的移动、重命名,创建目录、层级目录、FIFO管道文件、硬链接和软链接(创建普通文件使用open()函数),判断有无对文件或目录有指定的权限,查询指定目录下的所有文件列表等;
使用shutil模块进行高级文件和目录操作,如:文件(内容、权限位、时间属性、全部)复制,目录递归复制、非空目录递归删除;
使用zipfile或tarfile模块进行文件的归档压缩操作,shutil模块提供的解压函数是Python 3.2版本才提供的,因此对于使用Python 2进行开发的项目是无法使用shutil模块提供的所有功能函数的;当然运维的同学有时也会直接执行tar命令是实现压缩和解压缩,但是跨平台性就无法保证了。
更多Python之文件与目录操作及压缩模块(os、zipfile、tarfile、shutil)相关文章请关注PHP中文网!