大文本数据分块存csv


前言

接到 4G txt 文件需要处理,无法直接打开,直接处理起来也很费力
想到先将数据进行 分块,然后进行 数据块 处理


一、对大数据进行分块读取并保存

数据很大的文本文件无法直接使用 文本编辑器、notepad、Excel等软件打开,
使用Python代码先进行分块,然后再行处理

# 对大块txt数据进行切块分割,保存成 390000 行 的 csv 数据
def cut_data(file_txt):
    # 成块读入
    reader = pd.read_table(file_txt, header=None, encoding='gbk', sep="\t", chunksize=390000)
    i = 0
    # 对数据块操作,切割成小数据,便于 Excel 或 notepad++ 打开
    for chunk in reader:
        i = i + 1
        # 保存分块后的数据到csv文件,并编号设置文件名
        chunk.to_csv(r"F:\data\name_{}.csv".format(i))
        print(r"F:\data\name_{}.csv".format(i))

pd.read_table 是 Pandas 库中的一个函数,用于从文本文件中读取数据并将其转换为DataFrame对象。

这个函数的基本语法如下:

pd.read_table(filepath_or_buffer, sep='\t', delimiter=None, header='infer', names=None, index_col=None, dtype=None)

参数说明:

  • filepath_or_buffer:要读取的文件路径或文件对象。
  • sep:用于分隔字段的字符串,默认为制表符(‘\t’)。
  • delimiter:用于分隔字段的字符串,如果指定了该参数,则sep参数将被忽略。
  • header:指定作为列名的行号,默认为第一行('infer’表示自动推断)。
  • names:用于指定列名的列表,如果不指定,则使用header行或自动生成的列名。
  • index_col:用于指定索引列的列号或列名。
  • dtype:用于指定列的数据类型。

chunksize 参数为所需的块大小

# 如果希望每个块包含 1000 行数据,读取csv同理
chunksize = 1000
data_reader = pd.read_csv('filename.csv', chunksize=chunksize)

二、转化为常规csv文件

数据分块后是 n 行 1 列(我的数据分块后是这样)
需要处理成 n 行 m 列的常规数据(便于后续操作)

  1. 准备好新的文件路径
  2. 块数据处理
  3. 保存到新的文件
# 将 n 行 1 列的数据转换成 n 行 m 列的数据
def chunk_to_csv(file):	#  file为 块数据 路径

	
    # 将路径分割成 文件夹 和 文件名
    folder_path, file_name = os.path.split(file)
	''' 
	folder_path = F:\data           	file_name  = name_1.csv
	'''
	# 拼接成新的文件路径
    csv_file = os.path.join(new_folder_path, file_name)
    
	# 提前准备好处理后 块数据 的列名
	columns = ['报文号', 'MMSI', ... , 'AIS报文时间', 'temp1']
    
    # 读取分块后的csv文件,
    # index_col=0,忽略默认的索引列,使用默认整数索引作为数据框的索引
    df = pd.read_csv(file, index_col=0, header=0)
    # reset_index() 方法将 "序号" 列重置为数据框的列,并将 inplace 参数设置为 True,以便在原始数据框上进行修改。
    df.reset_index(drop=True, inplace=True)
    # 通过赋值对新数据列 改名
    df.rename(columns={'0': 'value'}, inplace=True)

    # 将数据按分号分割成多个列,并 赋值 新的 列名
    df[columns] = df['value'].str.split(';', expand=True)
    # 将原数据列删除,"drop"函数用于删除指定的列,"axis=1"表示按列删除。
    df = df.drop('value', axis=1)
    # 保存转换形式后的数据
    df.to_csv(csv_file, index=False, header=columns)

    # 返回文件路径,方便后续处理
    return csv_file

三、其他问题

在处理 转化csv数据 的时候,可能分割后的 列值 不相同
如分割成10列,分割成11列
在上述代码中添加判断条件即可在使用同一py中完成块数据处理

def cut_to_csv(file):
    folder_path, file_name = os.path.split(file)
    csv_file = os.path.join(folder_clean, file_name)

	columns10 = ['报文号', 'MMSI', ... , 'AIS报文时间', 'temp1']
    columns11 = ['报文号', 'MMSI', ... , 'AIS报文时间', 'temp1', 'temp2']
	
    df = pd.read_csv(file, index_col=0, header=0)
    df.reset_index(drop=True, inplace=True)
    df.rename(columns={'0': 'value'}, inplace=True)
    
    # 将数据按 ';' 进行分割
    ddff = df['value'].str.split(';', expand=True)
    # 统计分割后数据的 列值
    num = ddff.shape[1]
    # 判断 列值 ,进行对应列名赋值分割,并保存
    if num == 10:
        df[columns10] = df['value'].str.split(';', expand=True)
        df = df.drop('value', axis=1)
        df.to_csv(csv_file, index=False, header=columns26)
    elif num == 11:
        df[columns11] = df['value'].str.split(';', expand=True)
        df = df.drop('value', axis=1)
        df.to_csv(csv_file, index=False, header=columns25)

    return csv_file


总结

以上就是今天要讲的内容,本文简单介绍了:

  • 大数据 分块保存
  • 块数据 转化保存
  • 不同列 的块数据处理方法

每天进步一点点…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值