Python—使用tkinter制作万能文件拆解工具

大文件一直是很头痛的事情,比如很大csv或者excel,打开非常困难需要拆解。另外文本文件太大,也会造成阅读困难,也有拆解的需求。一直以来都没有很好的文件拆解工具,我这次独辟蹊径,制作了兼容txt,csv和Excel的文件拆解工具,对付几百万行的文件都不是问题。

代码如下:

import os
import tkinter as tk
from tkinter import filedialog, messagebox, ttk
import pandas as pd
class Resolve(tk.Tk):
  def __init__(self):
    super().__init__()    #建立窗口
    self._set_window()
    self._create_body()

  def _set_window(self):
    self.title('文本文件拆解小工具')
    self.geometry('550x500')
    self.wm_attributes('-topmost',True)  #置顶

  def _create_body(self):
    frame1=tk.Frame(self,padx=15,pady=5)
    frame1.grid(row=0,column=0, sticky='w')
    self.newname=tk.StringVar()
    self.path=tk.StringVar()
    self.lineno=tk.IntVar()
    ttk.Button(frame1, text='打开文件',command=self.getfile).grid(row=0, column=0, sticky='w',pady=3)
    ttk.Entry(frame1, textvariable=self.path, width=35).grid(row=0, column=1)
    ttk.Label(frame1,text='保存的文件名:').grid(row=1,column=0,pady=3)
    ttk.Entry(frame1, textvariable=self.newname, width=35).grid(row=1,column=1)
    ttk.Label(frame1,text='每个文件的行数:').grid(row=2,column=0,pady=3)
    ttk.Spinbox(frame1,textvariable=self.lineno,from_= 1000,to=300000,increment=10000).grid(row=2,column=1,sticky='w')
    ttk.Button(frame1,text="导出",command=self.processing).grid(row=3,column=0,pady=3)
    ttk.Button(frame1,text="使用说明",command=self.manual).grid(row=3,column=1,sticky='w')

  def getfile(self):
    #获取选择的文件
    file_path = filedialog.askopenfilename(title=u'选择文件',filetype=[('文本','.txt'),('Csv','.csv'),('Excel','.xlsx'),('Excel','.xls')])
    self.path.set(file_path)

  def processing(self):
    lineno=self.lineno.get()                                  #行数
    newname=self.newname.get()                                #新名
    sourcefile=self.path.get()                                #文件名
    extend=os.path.splitext(sourcefile)[1]                    #文件扩展名
    newpath=os.path.join(os.path.dirname(sourcefile),newname) #新文件路径
    num=0                                                     #文件个数
    #获取文件编码
    if(extend in ['.txt','.csv']):                                              
      try:
        pd.read_csv(sourcefile,encoding='utf-8')
      except UnicodeDecodeError:
        coding='gbk'
      else:
        coding='utf-8'
    if(extend=='.txt'):
      flag=0
      dataList=[]
      with open(sourcefile,'r',encoding=coding) as f_source:
        for line in f_source:
          flag+=1                     #第几行
          dataList.append(line)       
          if(flag==lineno):
              num+=1                 #第几个文件
              with open(newpath+'-'+str(num)+".txt",'w+') as f_target:
                  for data in dataList:
                      f_target.write(data)
              flag=0
              dataList = []
        # 处理最后一批行数
        if(dataList):
          num+=1
          with open(newpath+'-'+str(num)+".txt",'w+') as f_target:
            for data in dataList:
              f_target.write(data)
    if(extend=='.csv'):
      reader=pd.read_csv(sourcefile,encoding=coding,iterator=True)
      while True:
        try:
          chunk=reader.get_chunk(lineno)
          chunk.to_excel(newpath+'-'+str(num)+".xlsx",index=False)
        except StopIteration:
          break
        else:
          num+=1
    if(extend in ['.xlsx','.xls']):
      try:
        df=pd.read_excel(sourcefile)
      except Exception as e:
        messagebox.showerror('警告',str(e))
      else:
        leng=df.shape[0]
        N=leng//lineno+1
        for num in range(0,N+1):
          dfx=df.iloc[num*lineno:(num+1)*lineno]
          if(dfx.shape[0]!=0):
            dfx.to_excel(newpath+'-'+str(num+1)+".xlsx",index=False)

    messagebox.showinfo('提示','文件拆分完成,一共拆得{}个文件,请查看'.format(num))
    os.system('start ' + os.path.dirname(newpath))    #打开文件路径

  def manual(self): #使用说明
    info="""
    文件的行数可以输入任意数字,也可以点击箭头选择
    上传的文件可以是txt,也可以是csv,也可以是Excel
    txt文件就拆分成txt,而csv文件则拆分为Excel
    Excel只拆分第一个工作表,其他表忽略,而且拆分后不保留原来的单元格式
    注意行数最好不要超过30万行,否则Excel打开困难
    大型csv或Excel文件拆分会耗时高达10分钟以上,请耐心等待
    """
    messagebox.showinfo('提示',info)

if __name__=="__main__":
  app=Resolve()
  app.mainloop()

点击下载
效果如下:
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值