Python rarfile 模块

2024 年 8 月 29 日 | 阅读 12 分钟

在下面的教程中,我们将讨论 Python 编程语言的 rarfile 模块。我们将通过一些示例来了解 rarfile 模块的不同类。

那么,让我们开始吧。

了解 Python rarfile 模块

Python 中的 rarfile 模块用于读取 RAR 压缩包。其接口设计得尽可能与 zipfile 类似。

rarfile 模块的基本功能

  1. 该模块使用 Python 编程语言解析压缩包结构。
  2. 它使用 Python 提取未压缩的文件。
  3. 它还可以使用 unrar 提取已压缩的文件。
  4. 可选地,我们也可以将压缩数据写入临时文件以加速 unrar;否则,每次执行都需要扫描整个压缩包。

现在,在我们开始使用该模块之前,让我们先安装它。

如何在 Python 中安装 rarfile 模块?

为了安装 rarfile 模块,我们将使用 pip 安装程序,遵循以下命令

语法

为了验证模块是否正确安装,我们可以创建一个新文件并添加 import 语句,看看是否会返回任何错误。

文件:verify.py

现在,保存 Python 文件并使用命令提示符运行执行命令

语法

如果上述 Python 文件没有引发任何导入错误,我们就可以继续进行 Facebook Messenger 机器人的构建过程。但是,如果它确实引发了异常,建议重新安装模块并参考其官方文档。

现在,让我们来了解 rarfile 模块的基础知识。

rarfile 模块的类

rarfile 模块提供了多个类,我们可以根据需求使用。这些类是

  1. RarFile
  2. RarInfo
  3. RarExtFile
  4. nsdatetime

我们将简要讨论这些类。

了解 RarFile 类

rarfile 模块的 RarFile 类用于解析 RAR 结构,提供对压缩包中文件的访问。

RarFile 类的执行语法如下所示

语法

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 包装它。

在 io 模块不可用的旧版本 Python 中,它仅实现 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)

此方法用于将所有文件提取到当前目录。

参数

  1. path - 这是一个可选参数,包含目标路径。
  2. members - 这是另一个可选参数,包含文件名或 RarInfo 的实例。
  • pwd - 这是另一个可选参数,包含要使用的密码。

18. testrar(pwd = None)

此方法用于读取所有文件并测试 CRC。

19. strerror()

如果解析失败,此方法返回一个错误字符串;如果未发生异常,则返回 None。

了解 RarInfo 类

rarfile 模块的 RarInfo 类用作 RAR 压缩包中的一个条目。

作为 datetime 的时间戳在 RAR3 中不带时区,在 RAR5 压缩包中带有 UTC 时区

RarInfo 类的执行语法如下所示

语法

RarInfo 类的一些方法和属性如下所示

1. filename

此属性包含带相对路径的文件名。此属性的值始终是一个 Unicode 字符串,指定路径,路径分隔符为 '/'。

2. date_time

此属性包含文件修改的时间戳。它可以作为一个元组(年、月、日、时、分、秒)使用。RAR5 允许压缩包中缺少该字段,此时它为 None。

3. comment

此属性包含可选的文件注释字段。该值由一个 Unicode 字符串组成。(仅限 RAR3)

4. file_size

此属性用于指定未压缩大小。

5. compress_size

此属性用于指定压缩后的大小。

6. compress_type

此属性用于指定压缩方法:RAR_M0, ..., RAR_M5 常量之一。

7. extract_version

此属性包含解压所需的最低 RAR 版本。格式为 (主版本号*10 + 次版本号),因此 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 风格或 unix 风格,具体取决于 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 类

rarfile 模块的 RarExtFile 类作为 RarFile.open() 返回的类文件对象的基类。

基类:io.RawIOBase

RarExtFile 类的语法如下所示

语法

此类提供公共方法和通用的 CRC 检查

行为

  1. 无短读 - read()readinfo() 会读取请求的全部数据量。
  2. 无内部缓冲区;我们必须使用 BufferedReader 来实现。

RarExtFile 类的一些属性和方法如下所示

1. name= None

此属性用于指定压缩包条目的文件名

2. read(n=-1)

此方法用于从压缩包条目中读取全部或指定数量的数据。

3. close()

此方法用于关闭打开的资源。

4. readinto(buf)

此方法用于定义直接读入缓冲区的零拷贝读取。它返回读取的字节数。

5. tell()

此方法返回未压缩数据中的当前读取位置。

6. seek(offset, whence = 0)

此方法用于定位数据。在未压缩的文件上,定位通过实际的 seek 操作实现,因此速度很快。在压缩文件上,速度较慢——向前定位通过预读实现,向后定位通过重新打开并从头开始解压缩实现。

7. readable()

此方法返回 True

8. writable()

此方法返回 False,因为不支持写入。

9. seekable()

此方法返回 True,因为支持定位,尽管在压缩文件上速度较慢。

10. readall()

此方法用于读取所有剩余数据

11. fileno()

如果存在底层文件描述符,此方法将返回它。如果 IO 对象不使用文件描述符,则会引发 OSError。

12. isatty()

此方法返回这是否是一个“交互式”流。如果无法确定,它也返回 False。

13. readline()

此方法用于从流中读取并返回一行。对于二进制文件,行终止符始终为 b'n';对于文本文件,我们可以使用 open 的 newlines 参数来选择识别的行终止符。如果给定了 size,最多将读取 size 个字节。

14. readlines()

此方法用于从流中返回一个行列表。我们可以指定 hint 来控制读取的行数:如果到目前为止所有行的总大小(以字节/字符为单位)超过 hint,则不会再读取更多行。

了解 nsdatetime 类

rarfile 模块的 nsdatetime 类表示携带纳秒的 Datetime。此类不支持算术运算,并且会丢失纳秒。

基类: datetime.datetime

4.0 版本新增

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 模块的一些函数如下

序号。函数描述
1rarfile.is_rarfile(xfile)此函数用于检查文件是否为 RAR 压缩包。
2Rarfile.is_rarfile_sfx(xfile)此函数用于检查文件是否为支持 SFX 的 RAR 压缩包。
它将从文件中读取 2M。

rarfile 模块的常量

rarfile 模块的一些常量如下

序号。常量描述
1rarfile.RAR_M0 = 48此常量表示无压缩。
2rarfile.RAR_M1 = 49此常量表示压缩级别 - m1,最快压缩。
3rarfile.RAR_M2 = 50此常量表示压缩级别 - m2。
4rarfile.RAR_M3 = 51此常量表示压缩级别 - m3。
5rarfile.RAR_M4 = 52此常量表示压缩级别 - m4。
6rarfile.RAR_M5 = 53此常量表示压缩级别 - m5,也是最大压缩。
7rarfile.RAR_OS_WIN32 = 2此常量表示操作系统类型,即 Windows。
8rarfile.RAR_OS_UNIX = 3此常量表示操作系统类型,即 UNIX。
9rarfile.RAR_OS_MACOS = 4此常量表示操作系统类型,即 MacOS(仅在 RAR3 中)。
10rarfile.RAR_OS_BEOS = 5此常量表示操作系统类型,即 BeOS(仅在 RAR3 中)。
11rarfile.RAR_OS_OS2 = 1此常量表示操作系统类型,即 OS2(仅在 RAR3 中)。
12rarfile.RAR_OS_MSDOS = 0此常量表示操作系统类型,即 MS-DOS(仅在 RAR3 中)。

rarfile 模块的警告和异常

rarfile 模块的一些警告和异常如下

序号。警告与异常描述
1class rarfile.UnsupportedWarning当压缩包使用了 rarfile 模块不支持的功能时,会发生此警告。
4.0 版本新增。
2class rarfile.Error此异常是 rarfile 错误的基类。
3class rarfile.BadRarFile当压缩包中存在不正确的数据时,会引发此异常。
4class rarfile.NotRarFile当文件不是 RAR 压缩包时,会引发此异常。
5class rarfile.BadRarName当系统无法猜测多分卷名称组件时,会引发此异常。
6class rarfile.NoRarEntry当在 RAR 中找不到文件时,会引发此异常。
7class rarfile.PasswordRequired当文件需要密码时,会引发此异常。
8class rarfile.NeedFirstVolume(msg, volume)当必须从第一个分卷开始时,会引发此异常。
9class rarfile.NoCrypto当我们无法解析加密的头部时会引发此异常 - 没有可用的加密功能。
10class rarfile.RarExecError当 unrar/rar 报告问题时,会引发此异常。
11class rarfile.RarWarning当出现非致命错误时,会引发此异常。
12class rarfile.RarFatalError当发生致命错误时,会引发此异常。
13class rarfile.RarCRCError当解压过程中发生 CRC 错误时,会引发此异常。
14class rarfile.RarLockedArchiveError当我们尝试修改锁定的压缩包时,会引发此异常。
15class rarfile.RarWriteError当我们尝试写入 RAR 文件时,会引发此异常。
16class rarfile.RarOpenError当我们尝试打开 RAR 文件时,会引发此异常。
17class rarfile.RarUserError此异常表示用户错误。
18class rarfile.RarMemoryError此异常表示内存错误。
19class rarfile.RarCreateError此异常表示创建错误。
20class rarfile.RarNoFilesError当找不到与模式匹配的文件时,会引发此异常。
21class rarfile.RarUserBreak当用户停止操作时,会引发此异常。
22class rarfile.RarWrongPassword此异常引发于密码不正确。
23class rarfile.RarUnknownError此异常表示未知的退出代码。
24class rarfile.RarSignalExit当 unrar 因信号退出时,会引发此异常。
25class rarfile.RarCannotExec当找不到可执行文件时,会引发此异常。

rarfile 模块的工作原理

现在让我们考虑以下示例,演示 rarfile 模块的工作原理。

示例

输出

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() 方法读取了该文件。