python 文本分类

txt文本按照编码分类

介绍

嗯,这是个python编写的文本分类器。
具体就是,它会遍历指定文件夹的所有txt文件,并检查其编码格式,按照设定的规则将编码分类,移动到不同的文件夹中。

背景

目的嘛,我喜欢收集小说,十多万本了,都存在calibre中。
小说嘛,编码格式奇奇怪怪,其实也没啥,但calibre有个缺点,对有些编码文本文件在添加时会很慢,进度不动,一直0%,其实本来也好解决,转码就是了。
可是我书太多了,转码太麻烦,又怕出现乱码。
而且,转码后以后遇到同一个资源不容易查重。
综上所述,我干脆不转码了,我压缩,calibre对压缩包不做检查,添加速度贼快。
所以我打算将不是指定编码的文件都移到一起,批处理单个压缩。

问题

其实这有个问题,我书很多,于是我就担心啊。
我需要遍历文件夹里的所有书,就得获取文件名,如果一次性获取目录,可能会占很大内存(其实有点杞人忧天,这才多大字节)。
于是我查了下遍历的方法

os.walk()

glob.glob()

os.listdir()

path.rglob

path.rglob
os.scandir 的运行效率要高于 os.walk

python os.scandir文件操作

然后就是编码检查这个问题,全文检索,不现实,我也查到了方法。
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的请无视。)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值