如果处理的数据大于电脑内存,分块处理文件,再把处理好的文件输出
# -*- coding: utf-8 -*-
"""
Created on Sun Mar 21 16:25:16 2021
@author: sen
"""
import pandas as pd
import numpy as np
import os
import random
os.chdir("F://Code_sen//Data//data_500M")
def genSizeFile(fileName, fileSize):
#文件名
filePath="Data"+fileName+".txt"
# 生成固定大小的文件,数据有三列
# date size
ds=0
i=0
lst = ['a','b','c']
with open(filePath, "w", encoding="utf-8") as f:
while ds<fileSize:
i = i + 1
f.write(str(i)+","+str(round(random.uniform(-1000, 1000),2))+","+str(random.sample(lst, 1)))
f.write("\n")
ds=os.path.getsize(filePath)
print(os.path.getsize(filePath))
# start here.
genSizeFile("100M",100*1024*1024)
def genNFile(fileNum):
# 生成固定行的文件
numCount=fileNum
numRange=3*numCount
tmpList=random.sample(range(numRange), numCount)
i=0
filePath=""+str(numCount)+".txt"
with open(filePath, "w", encoding="utf8") as f:
while i<numCount:
f.write(str(tmpList[i]))
f.write("\n")
i=i+1
#1、指定chunksize分块读取文件 原理就是不一次性把文件数据读入内存中,而是分多次。
#read_csv 和 read_table 有一个 chunksize 参数,
#用以指定一个块大小(每次读取多少行),返回一个可迭代的 TextFileReader 对象。
table=pd.read_table('Data100M.txt',
sep=',',#指定数据中变量之间的分隔符,注意这里是中文的逗号
header=None , #不需要将原来的数据中的第一行读作表头
names=['id','event','name'] , #重新为各列起变量名称
#converters={'id':str} ,#将ID转换为字符串,以免开头的00消失
chunksize=1000000
)
#table=pd.read_table('Data100M.txt',
# sep=',',#指定数据中变量之间的分隔符,注意这里是中文的逗号
# header=None , #不需要将原来的数据中的第一行读作表头
# names=['id','event','name'] , #重新为各列起
# )
#table.head()
#table2 = table.head()
#table['name'].value_counts()
#['a'] 1584844
#['c'] 1584844
#['b'] 1584522
#ddd = table2['name'].str[2:3]
i = 0
for df in table:
i = i + 1
#对df处理,第三列['a'] 只保留字母部分
df['new'] = df['name'].str[2:3]
print(type(df),df.shape)
print(i)
df.to_csv('filename%i.txt' %i, sep=',',header=None , index=False)