前言
接到 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 列的常规数据(便于后续操作)
- 准备好新的文件路径
- 块数据处理
- 保存到新的文件
# 将 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
总结
以上就是今天要讲的内容,本文简单介绍了:
- 大数据 分块保存
- 块数据 转化保存
- 不同列 的块数据处理方法
每天进步一点点…