工作中经常遇到需要合并多个文件,但偶尔也需要将一个大文件拆分为小文件,其实这个功能在pandas里面很简单,今天我用2中方法满足你
需求思路分析:
如果要将1个大文件拆分为多个小文件,我的思路是这样的的:
- 首先要知道拆分大文件有多少行
- 需要将文件拆分为多少行的一个文件
- 将文件读取到pandas
- 采用iloc来读取
- 采用to_csv来保存
- 保存的文件名需要在原始的名字上加“_"加文件序列数
难点:
- 如果是一个不是很大的文件,那pandas可以直接读取
- 如果是一个超级大的文件,pandas读取就已经把内存用满了
- 如何建立循环来分批读取和保存文件
实现方法1:iloc
之前我们学过pandas的高性能数据读取,有一个函数iloc就是根据行位置来索引的,今天这个函数正好能排上用场,先复习一下:
iloc
data.iloc[[2,3,4,5],[2,3,4,5]]
首先导入需要的库:
#ecoding:utf-8# Created by Administrator at 2018-8-27import pandas as pdimport osfrom tkinter.filedialog import askdirectoryimport tkinter as tkfrom tkinter import filedialog
将数据读取到pandas:
print("请选择文件:")root = tk.Tk()root.withdraw()file_path = filedialog.askopenfilename()df=pd.read_csv(file_path,encoding='gbk')df
设置需要的每个文件的个数:
n=df.shape[0]num=10000file_name=os.path.splitext(os.path.basename(file_path))[0]p=0
n=df.shape[0]:读取文件的总行数
num=10000:设置每个文件的个数
file_name=os.path.splitext(os.path.basename(file_path))[0]:获取导入的文件名
核心代码:
for i in range(0,n,num): p+=1 dd=df.iloc[i:i+num] dd.to_csv("%s_%s.csv"% (file_name,p),encoding="gbk")print("拆分完成!")
重点有三个:
- iloc读取需要的行数据
- to_csv保存文件
- for循环采用步进的方式分块获取需要的行数
实现方法2:chunksize-推荐使用的方法
如果是一个很大很大的文件,全部导入到pandas也是很难的,这个时候我们可以采用read_cav的分块读取功能,将读取的每一块文件分别读取,然后保存,这也是我推荐的方法
首先还是读取文件:
print("请选择文件:")root = tk.Tk()root.withdraw()file_path = filedialog.askopenfilename()df=pd.read_csv(file_path,encoding='gbk',chunksize=10000)file_name=os.path.splitext(os.path.basename(file_path))[0]p=0
chunksize=10000就是设置你需要的每个文件的行数
核心代码:
for d in df: p+=1 d.to_csv("%s_%s.csv"% (file_name,p),encoding="gbk")print("拆分完成!")
有没有很简单,仅仅三行代码就可以完成!