吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 186|回复: 6
上一主题 下一主题
收起左侧

[Python 原创] 制作统计文件数量和文件类型的python

[复制链接]
跳转到指定楼层
楼主
qianaonan 发表于 2024-10-22 20:06 回帖奖励
本帖最后由 qianaonan 于 2024-10-22 20:19 编辑

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

预览图:


win1164位打包有可能32位的无法使用

转载需注明来源与作者!

转载需注明来源与作者!

转载需注明来源与作者!

重要的事情说三遍!

不废话放代码:


[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

免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
RobinMaas + 2 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
Markeyooo 发表于 2024-10-22 20:17
谢谢楼主的分享
3#
z2004y 发表于 2024-10-22 20:22
4#
wudavid33 发表于 2024-10-22 21:05
5#
sksun1983 发表于 2024-10-22 22:12
这软件很好
6#
cxsljw 发表于 2024-10-22 22:20
一条dos命令就能完成的事,搞了这么多代码。
dir /b /s /a-d *.zip *.tar *.gz *.bz2 *.rar *.db *.dll *.exe *.json *.pdb *.xml|find /C "."
7#
 楼主| qianaonan 发表于 2024-10-22 23:37 |楼主
cxsljw 发表于 2024-10-22 22:20
一条dos命令就能完成的事,搞了这么多代码。
dir /b /s /a-d *.zip *.tar *.gz *.bz2 *.rar *.db *.dll *. ...

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

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-10-23 01:31

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表