rar压缩文件用代码读取也需要一些注意事项的,有同学说rar文件解压了再用正常的读取程序不行吗?
可以是可以,但是当数据大到一定程度时,解压可能要几个小时......直接用python把里面的数据读取出来然后存储就行,这个时间就会比解压后再去读取会快很多,而且不需要解压,就不会占用更多的内存空间。
案例背景
有一个文本压缩包,有7个文件夹,每个文件夹里面有上万条对应主题的txt文件:
我解压过,一个文件夹要解压1个多小时...7个要多久根本顶不住....而且我需要里面的文本做分类数据,但是我也不需要很多,每种1w条就行,现在就读取这个rar文件,把里面的每个文件夹下抽取1w个txt文本,然后存入excel表里面,并且写上对应的标签。
前置准备
需要rarfile 和unrar两个包
pip install rarfile
pip install unrar
还需要一个exe文件,下载链接:
下载:UnRAR.exe
链接: https:///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条,整合好了,后面再用这个数据就很方便。