Python PyQt5实现了一个简单的大文件分割小工具,主要是为了练习qss样式表

使用Python的PyQt5库创建了一个简单实用的大文件分割应用,该应用注重了qss样式表的实践应用,提供了一种美观的用户界面。
摘要由CSDN通过智能技术生成

Python PyQt5实现了一个简单的大文件分割小工具,主要是为了练习qss样式表

main.py:

# -*- coding: utf-8 -*-
"""
-------------------------------------
:author LHY
:contact rain_and_sea@163.com
-------------------------------------
"""
from PyQt5.QtWidgets import (
    QWidget,
    QApplication,
    QLabel,
    QLineEdit,
    QPushButton,
    QProgressBar,
    QTextBrowser,
    QFileDialog,
    QMessageBox
)
from PyQt5.QtCore import Qt, QThread, pyqtSignal, QSize
from PyQt5.QtGui import QIcon
import sys
import os
import csv


class SpiltThread(QThread):
    log_signal = pyqtSignal(str)
    progress_signal = pyqtSignal(float)
    done_signal = pyqtSignal(bool)

    def __init__(self, file_name, save_path, file_size):
        super(SpiltThread, self).__init__()
        self.file_name = file_name
        self.save_path = save_path
        self.file_size = file_size
        self.kilobytes = 1024
        self.megabytes = self.kilobytes * 1024

    def run(self):
        try:
            parts = self.split(fromfile=self.file_name, todir=self.save_path, chunksize=self.file_size)
        except:
            pass
        else:
            pass

    def split(self, fromfile, todir, chunksize):
        """
        具体执行文件的分割
        :param fromfile: 待分割的文件
        :param todir: 子文件保存目录
        :param chunksize: 单个子文件的大小
        :return:
        """
        """获取文件的大小,类型"""
        total_size = round(os.path.getsize(fromfile) / (1024 * 1024), 2)  # 转化成MB
        file_type = fromfile.split(".")[-1]

        self.log_signal.emit("文件分割开始...")
        self.log_signal.emit("待分割的文件为: %s" % fromfile)
        self.log_signal.emit("待分割的文件大小为: %s Mb" % total_size)
        self.log_signal.emit("单个子文件的大小为: %s Mb" % chunksize)

        """判断保存目录是否存在,若不存在就创建,若存在清空目录中的所有文件"""
        if not os.path.exists(todir):
            os.mkdir(todir)
        else:
            for name in os.listdir(todir):
                os.remove(os.path.join(todir, name))

        """开始分割"""
        part_count = 0
        if file_type not in ["xlsx", "csv"]:
            with open(fromfile, 'rb') as inputfile:
                while True:
                    chunk = inputfile.read(int(float(chunksize) * self.megabytes))
                    if not chunk:
                        break
                    part_count += 1
                    print("start...")
                    filename = os.path.join(todir, ('part{0}.{1}'.format(part_count, file_type)))
                    print(filename)
                    with open(filename, 'wb') as fileobj:
                        fileobj.write(chunk)
                    self.log_signal.emit("子文件%s生成完成..." % part_count)
                    self.progress_signal.emit(os.path.getsize(filename))
        else:
            with open(fromfile, 'r') as f_in:
                reader = csv.reader(f_in)
                header1 = next(reader)
                header2 = next(reader)
                part_count = 0

                while True:
                    try:
                        part_count += 1
                        filename = os.path.join(todir, ('part{0}.{1}'.format(part_count, file_type)))
                        with open(filename, 'a', newline="") as f_out:
                            writer = csv.writer(f_out)
                            writer.writerow(header1)
                            writer.writerow(header2)
                            while True:
                                writer.writerow(next(reader))
                                size = os.path.getsize(filename)
                                if abs(round(size / 1024 ** 2, 1) - int(float(chunksize))) <= 0.01:
                                    break
                        self.log_signal.emit("子文件%s生成完成..." % part_count)
                        finish_size = 0
                        for file in os.listdir(todir):
                            finish_size += os.path.getsize(os.path.join(todir, file))
                        self.progress_signal.emit(finish_size)
                    except StopIteration as e:
                        break

        self.log_signal.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值