大文件一直是很头痛的事情,比如很大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()
点击下载
效果如下:

686

被折叠的 条评论
为什么被折叠?



