制作统计文件数量和文件类型的python

查看 58|回复 9
作者:qianaonan   
在做光盘电子档案统计中(主要是光盘读取太慢如果是一个文件夹还好,是一个压缩文件直接痛苦特别是单位那电脑懂得都懂,当然主要是懒的点和懒得数)突发奇想写的,如有不好敬请谅解。
统计一个文件夹里的所有文件,会显示文件类型和文件数量,且添加一键复制代码方便粘贴,支持的压缩文件格式:zip、tar、tar.gz、.tar.bz2、gz、bz2、rar、7z,
[color=]因为我没遇到其他压缩文件格式和加密文件,所以不支持加密的压缩文件和其他压缩文件格式(也不支持所有分卷压缩文件会被当做一个文件类型计算,例如:7z.001会文件数量+1,文件类型显示001),★以上能识别的压缩文件本身不计入文件数量和文件类型中,如有需要的功能请自行添加。
重新统计时另外一个文件夹时可以不用重启程序,直接点选择目录按钮选择新的目录,也会重新统计,当然这里的文件夹包括磁盘盘符,因为cd读取后是一个盘符,规则也遵循以上写的,遇到加密压缩文件会在cmd窗口报错,报错了就不会统计了
[color=]。
[color=]这个计算文件数量和windows自身属性中计算文件数量的有可能会有所出入,因为压缩文件等原因,所以至于相信哪个,请自行斟酌,反正我相信自己写的。
预览图:


image.png (51.4 KB, 下载次数: 0)
下载附件
2024-10-22 20:00 上传

win1164位打包有可能32位的无法使用
[color=]转载需注明来源与作者!
转载需注明来源与作者!
转载需注明来源与作者!
[color=]重要的事情说三遍!
[color=]不废话放代码:
[Python] 纯文本查看 复制代码# -*- coding:utf-8 -*-
import wx
import pyperclip
import os
import zipfile
import tarfile
from collections import defaultdict
import rarfile
import py7zr
def scan_file_types(start_dir):
    file_types = defaultdict(int)
    total_files = 0
    def process_archive(archive_path):
        nonlocal total_files
        if zipfile.is_zipfile(archive_path):
            with zipfile.ZipFile(archive_path, 'r') as zip_file:
                for file_info in zip_file.infolist():
                    ext = os.path.splitext(file_info.filename)[1].lower()
                    file_types[ext] += 1
                    total_files += 1
        elif tarfile.is_tarfile(archive_path):
            with tarfile.open(archive_path, 'r') as tar_file:
                for file_info in tar_file.getmembers():
                    ext = os.path.splitext(file_info.name)[1].lower()
                    file_types[ext] += 1
                    total_files += 1
        elif rarfile.is_rarfile(archive_path):
            with rarfile.RarFile(archive_path, 'r') as rar_file:
                for file_info in rar_file.infolist():
                    ext = os.path.splitext(file_info.filename)[1].lower()
                    file_types[ext] += 1
                    total_files += 1
        elif archive_path.endswith('.7z'):
            with py7zr.SevenZipFile(archive_path, mode='r') as szf:
                for file_info in szf.list():
                    ext = os.path.splitext(file_info.filename)[1].lower()
                    file_types[ext] += 1
                    total_files += 1
    for dirpath, dirnames, filenames in os.walk(start_dir):
        for filename in filenames:
            filepath = os.path.join(dirpath, filename)
            ext = os.path.splitext(filename)[1].lower()
            if ext in {'.zip', '.tar', '.tar.gz', '.tar.bz2', '.gz', '.bz2', '.rar', '.7z'}:
                process_archive(filepath)
            else:
                file_types[ext] += 1
                total_files += 1
    # 去重
    all_file_types = ", ".join(sorted(key for key in file_types.keys() if key)).replace(".", "")
    return all_file_types, total_files
class Frame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title='原创:吾爱qianaonan', size=(427, 168),name='frame',style=541072384)
        self.启动窗口 = wx.Panel(self)
        self.Centre()
        self.标签1 = wx.StaticText(self.启动窗口,size=(80, 24),pos=(14, 13),label='选择目录',name='staticText',style=2321)
        self.编辑框1 = wx.TextCtrl(self.启动窗口,size=(222, 22),pos=(87, 10),value='',name='text',style=16)
        self.按钮1 = wx.Button(self.启动窗口,size=(61, 32),pos=(319, 5),label='选择目录',name='button')
        self.按钮1.Bind(wx.EVT_BUTTON,self.按钮1_按钮被单击)
        self.按钮2 = wx.Button(self.启动窗口,size=(61, 32),pos=(319, 75),label='一键复制',name='button')
        self.按钮2.Bind(wx.EVT_BUTTON,self.按钮2_按钮被单击)
        self.按钮3 = wx.Button(self.启动窗口,size=(61, 32),pos=(319, 41),label='一键复制',name='button')
        self.按钮3.Bind(wx.EVT_BUTTON,self.按钮3_按钮被单击)
        self.标签2 = wx.StaticText(self.启动窗口,size=(80, 24),pos=(5, 48),label='文件类型',name='staticText',style=2321)
        self.标签3 = wx.StaticText(self.启动窗口,size=(80, 24),pos=(4, 79),label='文件数量',name='staticText',style=2321)
        self.编辑框3 = wx.TextCtrl(self.启动窗口,size=(222, 22),pos=(87, 45),value='',name='text',style=0)
        self.编辑框4 = wx.TextCtrl(self.启动窗口,size=(222, 22),pos=(87, 75),value='',name='text',style=0)
    def 按钮1_按钮被单击(self, event):
        with wx.DirDialog(self, "选择一个目录", style=wx.DD_DEFAULT_STYLE) as dialog:
            if dialog.ShowModal() == wx.ID_OK:
                selected_path = dialog.GetPath()
                self.编辑框1.SetValue(selected_path)
        self.编辑框3.SetValue(scan_file_types(self.编辑框1.GetValue())[0])
        self.编辑框4.SetValue(str(scan_file_types(self.编辑框1.GetValue())[1]))
    def 按钮2_按钮被单击(self, event):
        pyperclip.copy(self.编辑框4.GetValue())
    def 按钮3_按钮被单击(self,event):
        pyperclip.copy(self.编辑框3.GetValue())
class myApp(wx.App):
    def OnInit(self):
        self.frame = Frame()
        self.frame.Show(True)
        return True
if __name__ == '__main__':
    app = myApp()
    app.MainLoop()
老规矩,软件下载连接:
蓝奏云:https://wwkr.lanzout.com/i5qCb2d4xb1a
百度网盘:链接:https://pan.baidu.com/s/1DnPprv0RXaHd_uJBP35GPw
                  提取码:e78t

按钮, 窗口

cxsljw   

一条dos命令就能完成的事,搞了这么多代码。
dir /b /s /a-d *.zip *.tar *.gz *.bz2 *.rar *.db *.dll *.exe *.json *.pdb *.xml|find /C "."
qianaonan
OP
  


cxsljw 发表于 2024-10-22 22:20
一条dos命令就能完成的事,搞了这么多代码。
dir /b /s /a-d *.zip *.tar *.gz *.bz2 *.rar *.db *.dll *. ...

麻烦看清楚帖子好吧,首先你统计的文件格式是不确定的,当然我也知道dos也可以归纳所有文件的文件格式;其次压缩文件里面的文件数量和文件格式呢?最后我拿python分享代码是给学python的看,留已打包软件的连接给不会用的人用,如果你觉得dos命令好那你就用dos命令,去罗马的路有千万条,但目的地是一致的就行。
Markeyooo   

谢谢楼主的分享
z2004y   

感谢分享
wudavid33   

谢谢大神分享
sksun1983   

这软件很好
lazhou   

下载学习,谢谢大佬分享!
ManaCola   

下载学习,谢谢大佬分享~
t1r0   

非常好用,感谢提供
您需要登录后才可以回帖 登录 | 立即注册

返回顶部