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.