Python中的rarfile模块
在下面的教程中,我们将讨论Python编程语言中的rarfile模块。我们将了解rarfile模块的不同类,以及一些示例。
所以,让我们开始吧。
了解Python rarfile模块
Python中的rarfile模块用于读取RAR存档。接口尽可能地构建了类似zipfile的功能。
rarfile模块的基本功能:
- 此模块使用Python解析存档结构。
- 它使用Python提取非压缩文件。
- 它还使用unrar解压缩文件。
- 可选地,我们还可以将压缩数据写入临时文件以加快解压缩速度;否则,每次执行都需要扫描整个存档。
现在,在我们开始使用该模块之前,让我们先安装它。
如何在Python中安装rarfile模块
为了安装 rarfile 模块,我们将使用pip安装程序,使用以下命令:
语法:
$ pip3 install rarfile
为了验证模块是否安装正确,我们可以创建一个新文件并添加 import 语句,看是否返回任何错误。
文件:verify.py
import rarfile
现在,保存Python文件并使用命令提示符运行执行命令:
语法:
$ python verify.py
如果上述的Python文件没有引发任何导入错误,我们就可以继续进行Facebook Messenger机器人的构建过程了。然而,如果它引发了异常,则建议重新安装该模块并参考其官方文档。
现在,让我们了解一下 rarfile 模块的基础知识。
rarfile模块的类
rarfile 模块提供了多个我们可以根据需要使用的类。这些类包括:
- RarFile 类
- RarInfo 类
- RarExtFile 类
- nsdatetime 类
我们将简要讨论这些类。
了解RarFile类
rarfile 模块的 RarFile 类用于解析RAR结构,提供对存档中文件的访问。
执行 RarFile 类的语法如下所示:
语法:
class rarfile.RarFile(file, mode='r', charset=None, info_callback=None, crc_check=True, errors='stop', part_only=False)
以下展示了 RarFile 类的一些方法和属性:
1. comment = None
此属性用于表示归档的注释。该值可以是Unicode字符串,也可以是None。
2. filename = None
此属性用于提供文件的名称(如果有的话)。该值可以是Unicode字符串,也可以是None。
3. __enter__()
此方法用于打开上下文。
4. __exit__(type, value, traceback)
此方法用于退出上下文。
5. __iter__()
此方法用于遍历成员。
6. setpassword(pwd)
此方法用于设置在提取过程中使用的密码。
7. needs_password()
此方法在任何存档条目需要密码进行提取时返回True。
8. namelist()
此方法返回一个包含存档中文件的名称的列表。
9. infolist()
此方法返回存档中所有文件/目录的RarInfo对象。
10. volumelist()
此方法返回存档卷的文件名。
如果存档只有一个卷,列表包含主存档文件的名称。
11. getinfo(name)
此方法返回文件的RarInfo。
12. open(name, mode='r', pwd=None)
此方法返回类似文件的对象(RarExtFile),可以从中读取数据。
该对象实现了io.RawIOBase接口,因此我们可以进一步使用io.BufferReader和io.TextIOWrapper进行包装。
在以前的Python版本中,io模块不可用,该对象只实现read()、seek()、tell()和close()方法。
该对象可进行寻址,但仅对未压缩的文件进行快速寻址。对于压缩文件,寻址是通过预读和重新启动解压缩来实现的。
参数:
- name – 此参数是文件的名称或RarInfo的实例。
- mode – 此参数是文件打开的模式。必须为’r’。
- pwd – 此参数包含用于提取的密码。
13. read(name, pwd=None)
此方法返回存档条目的未压缩数据。
建议对大文件使用open()方法。
参数:
- name – 此参数是文件的名称或RarInfo的实例。
- pwd – 此参数包含用于提取的密码。
14. close()
此方法用于释放打开的资源。
15. printdir( file = None )
该方法用于将存档中的文件列表打印到stdout或给定的文件中。
16. extract( member , path = None , pwd = None )
该方法用于将单个文件提取到当前目录中。
参数:
- member – 该参数是文件名或RarInfo实例的名称。
- path – 这是一个可选参数,包括目标路径。
- pwd – 这是另一个可选参数,包括要使用的密码。
17. extractall( path = None , members = None , pwd = None )
该方法用于将所有文件提取到当前目录中。
参数:
- path – 这是一个可选参数,包括目标路径。
- members – 这是另一个可选参数,包括文件名或RarInfo实例的名称。
- pwd – 这是另一个可选参数,包括要使用的密码。
18. testrar( pwd = None )
该方法用于读取所有文件并测试CRC。
19. strerror()
如果解析失败,则此方法返回错误字符串;如果没有发生异常,则返回None。
了解RarInfo类
rarfile 模块的 RarInfo 类用作RAR存档中的条目。
RAR3中的时间戳是没有时区的datetime,而RAR5存档中带有UTC时区
下面是执行 RarInfo 类的语法示例:
语法:
class rarfile.RarInfo
下面展示了 RarInfo 类的一些方法和属性:
1. filename
此属性包含带有相对路径的文件名。此属性的值始终是Unicode字符串,路径由路径分隔符“/”分隔。
2. date_time
此属性包含文件修改的时间戳。它可以作为(year, month, day, hour, minute, second)的元组使用。RAR5允许缺少此属性,如果缺少则为None。
3. comment
此属性包含可选的文件注释字段。值由Unicode字符串组成。(仅用于RAR3)
4. file_size
此属性用于指定未压缩的大小。
5. compress_size
此属性用于指定压缩的大小。
6. compress_type
此属性用于指定压缩方法:RAR_M0、…、RAR_M5常量之一。
7. extract_version
此属性包含需要解压缩所需的最低RAR版本。以(major*10 + minor)的形式表示,因此2.9为29。
RAR3: 10, 20, 29
RAR5在存档中没有此字段,并且设置为50。
8. host_os
此属性指定主机操作系统类型,其中之一为RAR_OS_*常量。
RAR3: RAR_OS_WIN32、RAR_OS_UNIX、RAR_OS_MSDOS、RAR_OS_OS2、RAR_OS_BEOS
RAR5: RAR_OS_WIN32、RAR_OS_UNIX
9. mode
此属性用于指定文件属性。它可能是dos-style或unix-style,具体取决于host_os。
10. mtime
此属性用于指定文件修改的时间。值可以与date_time属性相同,不过以扩展精度的datetime对象形式表示。
11. ctime
此属性是一个可选的时间字段,指定创建时间。它也可以作为datetime对象。
12. atime
此属性也是一个可选的时间字段,指定最后访问的时间。它也可以作为datetime对象。
13. arctime
此属性也是一个可选的时间字段,指定存档时间。它也可以作为datetime对象。(仅用于RAR3)
14. CRC
此属性用于指定未压缩文件的CRC-32。此属性的值为无符号整数。
RAR5: 可能为None。
15. blake2sp_hash
此属性用于指定解压缩数据的Blake2SP哈希值。(仅用于RAR5)
16. volume
此属性用于指定卷号,从0开始。
17. volume_file
此属性用于指定文件开始的卷文件名。
18. file_redir
此属性由一个元组(type, flags, target)组成。(仅RAR5)。如果不为None,则该文件是某种类型的链接。(仅RAR5)
type是以下常量之一:
- RAR5_XREDIR_UNIX_SYMLINK:Unix符号链接
- RAR5_XREDIR_WINDOWS_SYMLINK:Windows符号链接
- RAR5_XREDIR_WINDOWS_JUNCTION:Windows连接点
- RAR5_XREDIR_HARD_LINK:指向目标的硬链接
- RAR5_XREDIR_FILE_COPY:当前文件是另一个存档条目的副本
flags可以包含位:
- RAR5_XREDIR_ISDIR:符号链接指向一个目录
19. is_dir()
此方法用于返回True,如果条目是一个目录。
4.0版本中新增。
20. is_symlink()
此方法用于返回True,如果条目是一个符号链接。
4.0版本中新增。
21. is_file()
此方法用于返回True,如果条目是一个普通文件。
4.0版本中新增。
22. needs_password()
此方法用于返回True,如果数据存储受密码保护。
23. isdir()
此方法用于返回True,如果条目是一个目录。
自4.0版本起已弃用。
理解RarExtFile类
RAR模块的RarExtFile类作为与RarFile.open()返回的文件相似的对象的基类。
基类: io.RawIOBase
RarExtFile类的语法如下:
语法:
class rarfile.RarExtFile
这个类提供了公共方法和常见的CRC检查
行为:
- 没有短读取 – 阅读() ,以及 readinfo() 阅读尽可能多的请求。
- 没有内部缓冲区;我们必须使用 BufferedReader 进行缓冲。
RarExtFile 类的一些属性和方法如下所示:
1. name = None
此属性用于指定存档条目的文件名
2. read( n=-1 )
此方法用于从存档条目中读取全部或指定数量的数据。
3. close()
此方法用于关闭打开的资源。
4. readinto( buf )
此方法用于将零拷贝读取直接定义到缓冲区中。返回读取的字节数。
5. tell()
此方法返回未压缩数据中的当前读取位置。
6. seek( offset, whence = 0 )
此方法用于寻找数据。对于未压缩的文件,寻址通过实际寻址实现,因此速度很快。对于压缩文件,寻址很慢 – 通过预读进行前向寻址,通过重新打开和从头开始解压进行后向寻址。
7. readable()
此方法返回True
8. writable()
此方法返回False,因为不支持写入。
9. seekable()
此方法返回True,因为支持寻址,尽管在压缩文件上速度较慢。
10. readall()
此方法用于读取剩余的所有数据
11. fileno()
此方法返回底层文件描述符(如果存在)。如果IO对象不使用文件描述符,则引发OSError。
12. isatty()
此方法返回是否为’交互式’流。如果无法确定,也返回False。
13. readline()
此方法用于从流中读取并返回一行。对于二进制文件,行终止符始终为b’n’;对于文本文件,我们可以使用newlines参数以选择识别的行终止符。如果给定了大小,最多读取size字节。
14. readlines()
此方法用于返回流中的行列表。我们可以指定提示来控制读取的行数:如果到目前为止所有行的总大小(以字节/字符计)超过提示,则不会再读取更多行。
了解nsdatetime类
nsdatetime 类的 rarfile 模块表示携带纳秒的日期时间。该类不支持算术运算并且会丢失纳秒。
基类: datetime.datetime
新版本 4.0
nsdatetime 类的语法如下所示:
语法:
class rarfile.nsdatetime
下面显示了 nsdatetime 类的一些属性和方法:
1. nanosecond
该属性包含从0到999999999的纳秒数。
2. isoformat(sep=’T’, timespec=’auto’)
该方法用于默认使用纳秒精度格式化。
3. astimezone(tz=None)
该方法用于转换到新的时区。
4. replace(year=None, month=None, day=None, hour=None, minute=None, second=None, microsecond=None, tzinfo=None, *, fold=None, nanosecond=None)
该方法用于返回具有给定字段替换的新时间戳。
rarfile模块的函数
rarfile模块的一些函数如下:
序号 | 函数 | 描述 |
---|---|---|
1 | rarfile.is_rarfile(xfile) | 此函数用于检查文件是否为RAR存档。 |
2 | Rarfile.is_rarfile_sfx(xfile) | 此函数用于检查文件是否为支持SFX的RAR存档。 它会从文件中读取2M。 |
rarfile模块的常量
rarfile 模块的一些常量如下所示:
序号 | 常量 | 描述 |
---|---|---|
1 | rarfile.RAR_M0 = 48 | 此常量表示无压缩。 |
2 | rarfile.RAR_M1 = 49 | 此常量表示压缩级别 – m1,最快的压缩。 |
3 | rarfile.RAR_M2 = 50 | 此常量表示压缩级别 – m2。 |
4 | rarfile.RAR_M3 = 51 | 此常量表示压缩级别 – m3。 |
5 | rarfile.RAR_M4 = 52 | 此常量表示压缩级别 – m4。 |
6 | rarfile.RAR_M5 = 53 | 此常量表示压缩级别 – m5,也是最大的压缩级别。 |
7 | rarfile.RAR_OS_WIN32 = 2 | 此常量表示操作系统类型,即Windows。 |
8 | rarfile.RAR_OS_UNIX = 3 | 此常量表示操作系统类型,即UNIX。 |
9 | rarfile.RAR_OS_MACOS = 4 | 此常量表示操作系统类型,即MacOS(仅在RAR3中)。 |
10 | rarfile.RAR_OS_BEOS = 5 | 此常量表示操作系统类型,即BeOS(仅在RAR3中)。 |
11 | rarfile.RAR_OS_OS2 = 1 | 此常量表示操作系统类型,即OS2(仅在RAR3中)。 |
12 | rarfile.RAR_OS_MSDOS = 0 | 此常量表示操作系统类型,即MS-DOS(仅在RAR3中)。 |
rarfile模块的警告和异常
rarfile模块的一些警告和异常如下:
编号 | 警告和异常 | 描述 |
---|---|---|
1 | class rarfile.UnsupportedWarning | 此警告出现在存档中使用了rarfile模块不支持的功能。 从版本4.0开始。 |
2 | class rarfile.Error | 此异常是rarfile错误的基类。 |
3 | class rarfile.BadRarFile | 在存档中存在不正确的数据时引发此异常。 |
4 | class rarfile.NotRarFile | 当文件不是RAR存档时引发此异常。 |
5 | class rarfile.BadRarName | 当系统无法猜测多部分名称组件时,引发此异常。 |
6 | class rarfile.NoRarEntry | 当RAR中找不到文件时,引发此异常。 |
7 | class rarfile.PasswordRequired | 当文件需要密码时,引发此异常。 |
8 | class rarfile.NeedFirstVolume(msg, volume) | 当我们必须从第一个卷开始时,引发此异常。 |
9 | class rarfile.NoCrypto | 当我们无法解析加密头部时 – 没有可用的加密功能时,引发此异常。 |
10 | class rarfile.RarExecError | 当unrar/rar报告问题时抛出此异常。 |
11 | class rarfile.RarWarning | 当存在非致命错误时抛出此异常。 |
12 | class rarfile.RarFatalError | 当存在致命错误时抛出此异常。 |
13 | class rarfile.RarCRCError | 当解压过程中存在CRC错误时抛出此异常。 |
14 | class rarfile.RarLockedArchiveError | 当尝试修改已锁定的存档时抛出此异常。 |
15 | class rarfile.RarWriteError | 当我们尝试写入RAR文件时,引发此异常。 |
16 | class rarfile.RarOpenError | 当我们尝试打开RAR文件时,引发此异常。 |
17 | class rarfile.RarUserError | 此异常代表用户错误。 |
18 | class rarfile.RarMemoryError | 此异常代表内存错误。 |
19 | class rarfile.RarCreateError | 此异常代表创建错误。 |
20 | class rarfile.RarNoFilesError | 当找不到符合模式的文件时引发此异常。 |
21 | class rarfile.RarUserBreak | 用户停止时引发此异常。 |
22 | class rarfile.RarWrongPassword | 输入错误密码时引发此异常。 |
23 | class rarfile.RarUnknownError | 表示未知的退出代码。 |
24 | class rarfile.RarSignalExit | 当unrar以信号退出时引发此异常。 |
25 | class rarfile.RarCannotExec | 找不到可执行文件时引发此异常。 |
rarfile模块的工作原理
现在让我们来考虑下面的示例,展示了rarfile模块的工作方式。
示例:
# importing the required module
import rarfile
# using the RarFile class
myRarFile = rarfile.RarFile("myfolder.rar")
# iterating through the files in the archive
for file in myRarFile.infolist():
# printing the filenames and file sizes
print(file.filename, file.file_size)
# checking the readme file
if file.filename == "myfolder/readme.txt":
# reading the file
print(myRarFile.read(file))
输出:
myfolder/helloWorld.py 101
myfolder/image.jpg 281466
myfolder/readme.txt 49
b'Hello Python learners!\r\nWelcome to Javatpoint.com'
myfolder/ 0
解释:
在以上的代码片段中,我们导入了所需的模块。然后我们使用 RarFile 类来选择RAR归档文件。然后我们使用 for 循环来遍历归档中存在的文件并打印文件名以及大小。然后我们使用 if 条件语句来检查RAR归档文件是否包含readme.txt文件。最后,我们使用 read() 方法读取文件。