首页 > 编程语言 >python编码探测-优化版

python编码探测-优化版

时间:2024-09-23 13:45:04浏览次数:1  
标签:编码 Folderpath python filename chardet print path 探测

import os
import chardet
from tkinter import filedialog
from concurrent.futures import ThreadPoolExecutor

#获取文件的编码
def get_all_chardet(filename, max_bytes=1048576):  # 默认读取1MB
    try:
        with open(file=filename, mode='rb') as f3:  # 使用with保证文件被正确关闭
            data = f3.read(max_bytes)  # 限制读取的字节数
    except Exception as e:
        print(f"无法读取文件 {filename},错误信息:{e}")
        return
    
    if not data:
        print(f"文件 {filename} 内容为空")
        return
    
    result = chardet.detect(data)  # 检测文件内容
    if not result['encoding']:
        print(f"文件 {filename} 的编码检测失败")
        return
    a = list(result.values())
    print(f"{filename} 编码为: {a[0]}")  # 输出编码

#检测所有文件,使用多线程优化
def all_chardet_files(Folderpath):
    with ThreadPoolExecutor() as executor:
        for filepath, dirnames, filenames in os.walk(Folderpath):
            for filename in filenames:
                full_path = os.path.join(filepath, filename)
                executor.submit(get_all_chardet, full_path)

#输出指定文件类型的编码
def by_filetype(Folderpath):
    filetype = input('输入指定文件类型,例如.xml: ')
    with ThreadPoolExecutor() as executor:
        for filepath, dirnames, filenames in os.walk(Folderpath):
            for filename in filenames:
                if os.path.splitext(filename)[1] == filetype:  # 指定文件类型
                    full_path = os.path.join(filepath, filename)
                    executor.submit(get_all_chardet, full_path)

#获取指定编码的文件
def get_specified_chardet(filename, b, max_bytes=1048576):  # 默认读取1MB
    try:
        with open(file=filename, mode='rb') as f3:
            data = f3.read(max_bytes)
    except Exception as e:
        print(f"无法读取文件 {filename},错误信息:{e}")
        return
    
    if not data:
        print(f"文件 {filename} 内容为空")
        return
    
    result = chardet.detect(data)
    a = list(result.values())
    if a[0] == b:
        print(f"文件 {filename} 编码为指定的 {b}")

#输出特定编码的文件
def specified_chardet_files(Folderpath):
    b = input("请输入需要检测的编码: ")
    print(f"编码是 {b} 的文件如下:")
    with ThreadPoolExecutor() as executor:
        for filepath, dirnames, filenames in os.walk(Folderpath):
            for filename in filenames:
                full_path = os.path.join(filepath, filename)
                executor.submit(get_specified_chardet, full_path, b)

#获取非指定编码的文件
def get_no_specified_chardet(filename, b, max_bytes=1048576):  # 默认读取1MB
    try:
        with open(file=filename, mode='rb') as f3:
            data = f3.read(max_bytes)
    except Exception as e:
        print(f"无法读取文件 {filename},错误信息:{e}")
        return
    
    if not data:
        print(f"文件 {filename} 内容为空")
        return
    
    result = chardet.detect(data)
    a = list(result.values())
    if a[0] != b:
        print(f"文件 {filename} 编码不是 {b}")

#输出非指定编码的文件
def no_specified_chardet_files(Folderpath):
    b = input("请输入需要检测的编码: ")
    print(f"编码不是 {b} 的文件如下:")
    with ThreadPoolExecutor() as executor:
        for filepath, dirnames, filenames in os.walk(Folderpath):
            for filename in filenames:
                full_path = os.path.join(filepath, filename)
                executor.submit(get_no_specified_chardet, full_path, b)

#菜单函数
def case():
    print("utf-8  GB2312  ascii 等")
    print("1. 输出所有文件的编码")
    print("2. 输出指定类型文件的编码")
    print("3. 输出指定编码的文件")
    print("4. 输出非指定编码的文件")
    a = int(input("请输入选项:"))
    if a == 1:
        all_chardet_files(Folderpath)
    elif a == 2:
        by_filetype(Folderpath)
    elif a == 3:
        specified_chardet_files(Folderpath)
    elif a == 4:
        no_specified_chardet_files(Folderpath)

if __name__ == '__main__':
    print("输入需要检测的路径")
    Folderpath = filedialog.askdirectory()  # 获得选择好的文件夹
    print("检测的路径是 " + Folderpath)
    case()
    ask = input("是否继续?y or exit").lower()
    while ask == 'y':
        case()

标签:编码,Folderpath,python,filename,chardet,print,path,探测
From: https://www.cnblogs.com/sunfankun/p/18426941

相关文章

  • locust+python高并发压测总结
    locust+python全链路压测总结1.什么是接口?为系统提供数据服务的叫做接口(Interface)locust安装pipinstalllocust安装完成后:locust-h查看是否安装成功2.如何编写locust脚本?编写locust脚本主要分为以下几个步骤:导入Locust类定义用户行为定义任务运行脚本2.1导入Lo......
  • <<编码>> 第 17 章 自动操作(1)--计算设备 示例电路
    info::操作说明首先闭合清零(clear)开关,清除8位触发器(锁存器)中的内容,并把16位计数器的输出置为0000H然后闭合RAM控制面板的控制端开关(接管信号开关)手动输入一组要加的数注:RAM地址0,1,2,3处已预设了1,2,3,4四个值断开接管控制开......
  • D15【python接口自动化学习】-python基础之内置数据类型
    day15字典的常见操作(上)学习日期:20240922学习目标:内置数据类型--24常见常新:字典的常见操作(上)学习笔记:字典的内置函数访问字典的内容#访问字典的所有元素mail_list={'tom':'[email protected]','jerry':'[email protected]','john':'[email protected]'}print(mail_li......
  • Python NumPy处理数组的基本用法代码示例
    NumPy是一个用于处理数组(向量和矩阵)以及进行数值运算的Python库。下面是一些简单的例子来展示如何使用NumP:示例1:创建数组importnumpyasnpa=np.array([1,2,3])#创建一个一维数组b=np.array([[1,2,3],[4,5,6]])#创建一个二维数组print(a)print(b)示......
  • python面试题
    python是什么?Python是一种开放原始码、直译式、可携式、面向对象的程序语言,具有模块、多线程、异常处理以及自动内存管理功能。广泛应用包括Web开发(如Django和Flask框架)、数据科学(如Pandas和NumPy库)、机器学习(如TensorFlow和PyTorch框架)、自动化脚本、科学计算等。算法是什么?......
  • Python用TOPSIS熵权法重构粮食系统及期刊指标权重多属性决策MCDM研究|附数据代码
    分析师:SikunChen在当今世界,粮食系统的稳定性至关重要。尽管现有的全球粮食系统在生产和分配方面表现出较高的效率,但仍存在大量人口遭受饥饿以及诸多粮食安全隐患。与此同时,在学术领域,准确评估情报学期刊的质量和影响力对于学术研究和信息传播意义重大。本研究旨在通过多种方法对......
  • 邮件发送基础:深入SMTP协议、配置邮件服务器及Python实现
    目录引言SMTP协议基础定义与功能工作原理特性与优势邮件服务器配置第三方邮件服务商配置自建邮件服务器配置使用Python发送邮件安装smtplib和email模块发送简单纯文本邮件发送HTML格式邮件发送带附件的邮件完整示例:发送带附件的HTML邮件注意事项总结引言......
  • Python 类型提示全解析:从入门到精通的必备技巧(如何让Python代码更清晰、错误更少)
    文章目录......
  • python语言MIDI钢琴简谱播放器软件代码QZQ
    importtkinterastkimportpygame.midiimporttime初始化pygame.midipygame.midi.init()获取MIDI输出设备midi_out=pygame.midi.Output(0)乐器名称映射instrument_names={0:“大钢琴(声学钢琴)”,1:“明亮的钢琴”,2:“电钢琴”,3:“酒吧钢琴”,4......
  • python ssh arthas
    #!/bin/bashARTHAS_FILE="arthas-boot.jar"#检查arthas-boot.jar文件是否存在if[!-f"$ARTHAS_FILE"];thenecho"错误:未找到arthas-boot.jar文件,请确保该文件在当前目录中。"exit1fi#获取当前正在运行的Java进程echo"检测正在运行的Java进程......