Python中的rarfile模块

Python中的rarfile模块

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

所以,让我们开始吧。

了解Python rarfile模块

Python中的rarfile模块用于读取RAR存档。接口尽可能地构建了类似zipfile的功能。

rarfile模块的基本功能:

  1. 此模块使用Python解析存档结构。
  2. 它使用Python提取非压缩文件。
  3. 它还使用unrar解压缩文件。
  4. 可选地,我们还可以将压缩数据写入临时文件以加快解压缩速度;否则,每次执行都需要扫描整个存档。

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

如何在Python中安装rarfile模块

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

语法:

$ pip3 install rarfile

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

文件:verify.py

import rarfile

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

语法:

$ python verify.py

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

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

rarfile模块的类

rarfile 模块提供了多个我们可以根据需要使用的类。这些类包括:

  1. RarFile
  2. RarInfo
  3. RarExtFile
  4. 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 )

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

参数:

  1. path – 这是一个可选参数,包括目标路径。
  2. 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检查

行为:

  1. 没有短读取 – 阅读() ,以及 readinfo() 阅读尽可能多的请求。
  2. 没有内部缓冲区;我们必须使用 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() 方法读取文件。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程