txt文本按照编码分类
介绍
嗯,这是个python编写的文本分类器。
具体就是,它会遍历指定文件夹的所有txt文件,并检查其编码格式,按照设定的规则将编码分类,移动到不同的文件夹中。
背景
目的嘛,我喜欢收集小说,十多万本了,都存在calibre中。
小说嘛,编码格式奇奇怪怪,其实也没啥,但calibre有个缺点,对有些编码文本文件在添加时会很慢,进度不动,一直0%,其实本来也好解决,转码就是了。
可是我书太多了,转码太麻烦,又怕出现乱码。
而且,转码后以后遇到同一个资源不容易查重。
综上所述,我干脆不转码了,我压缩,calibre对压缩包不做检查,添加速度贼快。
所以我打算将不是指定编码的文件都移到一起,批处理单个压缩。
问题
其实这有个问题,我书很多,于是我就担心啊。
我需要遍历文件夹里的所有书,就得获取文件名,如果一次性获取目录,可能会占很大内存(其实有点杞人忧天,这才多大字节)。
于是我查了下遍历的方法
os.walk()
glob.glob()
os.listdir()
path.rglob
path.rglob
os.scandir 的运行效率要高于 os.walk
然后就是编码检查这个问题,全文检索,不现实,我也查到了方法。
Python中的编码判断
最后,字节流打开,字节流会更快。
python二进制读取和普通读取文本文件的区别
完整代码
# -*- coding: utf-8 -*-
'''
遍历指定文件夹下的所有文件,将文本文件按照编码格式分类
'''
import os
import shutil
from chardet.universaldetector import UniversalDetector
def encoding_detector(file_path):
detector = UniversalDetector()
with open(file_path, 'rb') as f:
for line in f:
print(line)
detector.feed(line)
if detector.done: # 检测到编码格式,则跳出循环
break
detector.close() # 关闭数据流
return detector.result['encoding']
if __name__=="__main__":
start_path='C:/Users/98034/Desktop/中转站/新建文件夹 (2)/'
end_path='C:/Users/98034/Desktop/中转站/'
count = 0 #计数器
with os.scandir(start_path) as it:
for entry in it:
count+=1
if (entry.name.endswith(".txt") or entry.name.endswith(".TXT")) and entry.is_file():
file_path=start_path+entry.name
file_name=entry.name
encoding=encoding_detector(file_path)
if encoding not in ["GB2312","utf-8","UTF-8-SIG"]:
shutil.move(start_path+"/"+file_name,end_path+"/"+file_name) #文件移动
print("序号:",count,"文件名:",file_name,"编码:",encoding)
嗯,就酱。(小声逼逼,其实我没用大量文件做实验,就用几百个试了试,因为我最后嫌弃麻烦,就全压缩了)
附带单文件压缩批处理代码
for %%i in (*.*) do "D:\7-Zip\7z.exe" a "%%~ni.7z" "%%i"
解释:
把代码复制,粘贴到新建文本文件中,保存,改后缀txt为bat。
哪个文件夹里的文件需要批量单体压缩,就把这个bat文件扔里面双击,它会逐一压缩为7z(不会删除原文件),后缀也正常。
批处理之家
对了有人需要批量改名吗,推荐一个软件,ReNamerPortable,感觉挺好用的(用Total Commander的请无视。)