Python 怒解 RAR

开发 后端
MacOS 可以直接解压 zip 文件,但 rar 文件却需要下载软件,于是我用了解优,过了段时间提示我需要付费才能用。

[[410504]]

本文转载自微信公众号「Python七号」,作者somenzz。转载本文请联系Python七号公众号。

MacOS 可以直接解压 zip 文件,但 rar 文件却需要下载软件,于是我用了解优,过了段时间提示我需要付费才能用。

我按耐不住,这么简单的需求,你让我付费,我大 Python 是吃素的嘛,一顿操作,5 分钟实现怒解 RAR 文件,以下是详细方法:

1、下载源码,编译 lib

从这里下载源码 https://www.rarlab.com/rar/unrarsrc-6.0.7.tar.gz

下载后,进入 unrar 目录,执行 make lib 编译,编译完成后,会在 unrar 目录会出现一个 libunrar.so 的动态链接库文件,记录这个 libunrar.so 路径。

2、编写代码,怒解 RAR

这里需要先设置下环境变量 UNRAR_LIB_PATH,设置成上步我们生成 libunrar.so 的路径,然后再导入 unrar 的 rarfile 模块时,UNRAR_LIB_PATH 的值就不是 None 了。

使用 unrar 前,请先 pip install unrar 一下。

  1. import os 
  2. os.environ.setdefault("UNRAR_LIB_PATH","/Users/aaron/Downloads/unsplash/unrar/libunrar.so"
  3.  
  4.  
  5. from unrar import rarfile 
  6. target_path = '/Users/aaron/Downloads/unsplash' 
  7. rf = rarfile.RarFile("/Users/aaron/Downloads/unsplash/python自动化运维.rar", mode='r') # mode的值只能为'r' 
  8. rf_list = rf.namelist() # 得到压缩包里所有的文件 
  9. print('rar文件内容:'
  10. for file in rf_list: 
  11.     print(file) 
  12.  
  13. rf.extractall(target_path) 
  14. print("解压完成"

3、让它更通用

上述代码虽然能用,但每次使用需要复制路径和文件名,不方便,这里我们把它做成一个命令行工具,代码修改如下:

  1. #!/Users/aaron/py38env/bin/python3 
  2. # -*- coding: utf-8 -*- 
  3.  
  4. import os 
  5. os.environ.setdefault("UNRAR_LIB_PATH","/Users/aaron/Downloads/unsplash/unrar/libunrar.so"
  6. import sys 
  7. from somedecorators import timeit 
  8. from unrar import rarfile 
  9.  
  10. @timeit() 
  11. def decompress(rar_file): 
  12.     rf = rarfile.RarFile(rar_file, mode='r') # mode的值只能为'r' 
  13.     rf_list = rf.namelist() # 得到压缩包里所有的文件 
  14.     for file in rf_list: 
  15.         print(file) 
  16.     rf.extractall() 
  17.  
  18. if __name__ == '__main__'
  19.     decompress(sys.argv[1]) 

文件第一行,指定了编译器为 #!/Users/aaron/py38env/bin/python3,这样在命令行执行时就不需要再敲 python 了。

函数上面使用了自己写的装饰器 somedecorators.timeit,只是为了统计时间,你可以 pip install somedecorators 来使用。

将上述代码保存为 unrarfile,然后复制到 /Users/aaron/py38env/bin/ 目录,不放这个目录也行,只要放在 $PATH 目录就可以在任意路径下调用。先加上用户可执行权限,再使用:

  1. chmod u+x /Users/aaron/py38env/bin/unrarfile 

然后随便找个 rar 文件,就可以执行 unrarfile rar文件名 进行解压了:

  1. (py38env) ➜  tmp unrarfile myCeleryProj.rar  
  2. myCeleryProj/.app.py.un~ 
  3. myCeleryProj/app.py 
  4. myCeleryProj/settings.py 
  5. myCeleryProj/tasks.py 
  6. myCeleryProj/__init__.py 
  7. myCeleryProj/__pycache__/celery.cpython-36.pyc 
  8. myCeleryProj/__pycache__/celeryconfig.cpython-36.pyc 
  9. myCeleryProj/__pycache__/tasks.cpython-36.pyc 
  10. myCeleryProj/__pycache__/__init__.cpython-36.pyc 
  11. myCeleryProj/__pycache__ 
  12. myCeleryProj 
  13. decompress cost 0.0070 seconds 
  14. (py38env) ➜  tmp  

是不是很方便?

最后的话

 

很多问题,只要会重复遇到,就要想办法彻底解决,否则,在某个未知时刻,这个问题还会出来烦人,Python 就是解决这类重复问题的利器。

 

责任编辑:武晓燕 来源: Python七号
相关推荐

2021-11-30 06:32:19

Redis宕机集群

2022-12-13 07:55:00

Python地理编码

2010-02-23 09:22:36

Python项目

2013-08-12 12:36:10

2010-01-22 10:56:01

fedorarar

2009-02-27 14:48:09

2018-04-08 15:32:47

Hadoop大数据Gartner

2020-07-03 07:46:22

CPUOS内存

2020-10-30 08:58:33

Python列表开发

2012-12-18 11:55:38

2021-09-23 09:49:02

IT工具技术

2017-01-12 08:31:40

2023-04-20 17:51:41

马斯克微软

2014-10-17 10:52:11

2013-11-04 09:47:43

微软Windows

2015-01-16 17:09:42

Windows8.1漏系统漏洞微软

2018-10-09 08:30:55

UbuntuLinuxRAR文件

2023-08-24 22:16:15

2014-10-15 10:35:57

2023-01-09 14:50:19

点赞
收藏

51CTO技术栈公众号