Python自动化小技巧15——读取rar文件中数据文件(无需解压)

rar压缩文件用代码读取也需要一些注意事项的,有同学说rar文件解压了再用正常的读取程序不行吗?

可以是可以,但是当数据大到一定程度时,解压可能要几个小时......直接用python把里面的数据读取出来然后存储就行,这个时间就会比解压后再去读取会快很多,而且不需要解压,就不会占用更多的内存空间。


案例背景

有一个文本压缩包,有7个文件夹,每个文件夹里面有上万条对应主题的txt文件:

 我解压过,一个文件夹要解压1个多小时...7个要多久根本顶不住....而且我需要里面的文本做分类数据,但是我也不需要很多,每种1w条就行,现在就读取这个rar文件,把里面的每个文件夹下抽取1w个txt文本,然后存入excel表里面,并且写上对应的标签。


前置准备

需要rarfile 和unrar两个包

pip install rarfile
pip install unrar

还需要一个exe文件,下载链接:

下载:UnRAR.exe
链接: https://pan.baidu.com/s/1St0XHD3wMB8v6CrDsvLK4g
提取码: 9hr5

将 UnRAR.exe,与你写的py或者ipynb文件目放在同一录下,就可以成功运行解压rar文件了。

不加这个可能会读取不全,就是这个txt文件可能有100个字,不加这个exe文件可能只读取了10个字.....而且可能报错:

raise BadRarFile("Failed the read enough data: req=%d got=%d" % (orig, len(data)))
rarfile.BadRarFile: Failed the read enough data: req=1151 got=52


正式读取

导入包

import rarfile
import os
import pandas as pd

打开这个rar文件,查看前10个文件

rf = rarfile.RarFile("News.rar") # 打开rar文件
rf.namelist()[:10]

查看前两个文件的文字:

for file_name in rf.namelist()[:2]:
    with rf.open(file_name) as f:
        print(f.read().decode('utf-8'))

 

 确实是教育主题的文字。

rar里面的文件打开也是open 的方法,然后.read(),再utf-8解码。

获取文件列表

#获取文件列表
folder_files = {}
for info in rf.infolist():
    path_parts = os.path.split(info.filename)
    if path_parts[0] not in folder_files:
        folder_files[path_parts[0]] = []
    if not path_parts[1]:
        continue
    folder_files[path_parts[0]].append(path_parts[1])

上面会生成一个字典,字典的键就是文件夹的名称,值就是一个列表,装着这个文件夹下面的所有文件名称。

我们可以查看一下有几个文件夹,每个文件夹里面有几个文件:

print(len(folder_files))
for folder, files in folder_files.items():
    print(f"{folder}文件夹下有{len(files)}文件")

 7个主题没有问题,每个主题的文件个数也是对得上的。

现在我每个文件夹下面只取前1w条就行。

#每类只取前1w个
for folder, files in folder_files.items():
    folder_files[folder]=files[:10000]

然后查看:

for folder, files in folder_files.items():
    print(f"{folder}文件夹下有{len(files)}文件")

 文件夹和对应的前1w个文件的名称都准备好了,下面就是循环读取,然后提出来存在df数据框里面。

df=pd.DataFrame(columns=['内容','种类'])
for folder, files in folder_files.items():
    print(f"{folder}读取中")
    for file in files:
        file_names=f'{folder}/{file}'
        with rf.open(file_names) as f:     
            df=df.append({'内容':f.read().decode('utf-8'),'种类':folder}, ignore_index=True)

最后储存:

df.to_excel('文本.xlsx',index=False)

 同名目录就会多出一个excel文件,查看:

 

 

 总共7w条,整合好了,后面再用这个数据就很方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阡之尘埃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值