如何高效将CSV中变长整数列表读入Python且不转为字符串
问题描述
我在CSV表格中存储了多行长度不一的整数列表,示例如下:
22,-14,-24,2,-26,18,20,-4,12,16,8,-6,-10 20,12,-16,18,28,24,4,-22,26,8,-10,-14,2,6 10,-26,-20,30,24,-22,18,-28,12,14,-6,-2,8,-16,-4 16, 22, 30, -18, -26, -28, 24, -8, 32, -14, 12, 4, 20, -10, 2, 6 32, 10, -14, 20, -22, 24, -4, -26, 34, 28, -30, 2, 12, 18, 6, -8, 16 8, -20, 34, 18, 30, 24, -4, 6, 28, -32, -12, -36, 10, 16, -38, 2, 14, -22, -26
需要将每行转换为整数数组,例如:
input = [22,-14,-24,2,-26,18,20,-4,12,16,8,-6,-10]
使用标准CSV读取方法:
import csv with open(file.csv, 'r') as f: reader = csv.reader(f) for line in reader: print(line)
得到的结果是字符串列表,无法直接用于需要整数数组的函数:
['22', '-14', '-24', '2', '-26', '18', '20', '-4', '12', '16', '8', '-6', '-10']
尝试过csv.QUOTE_NONE等参数无效,因为CSV本身不区分数据类型。文件有10万至100万行,要求解决方案高效,且列数不固定,无法手动转换类型。不局限于CSV格式,求可行方案。
解决方案
一、高效处理CSV文件
核心思路是批量将每行的字符串元素转换为整数,以下几种方法兼顾效率与简洁:
方法1:利用csv.reader的skipinitialspace参数优化
针对行内元素带空格的情况,开启skipinitialspace=True自动忽略逗号后的空格,直接批量转整数:
import csv with open('file.csv', 'r') as f: reader = csv.reader(f, skipinitialspace=True) for line in reader: int_list = list(map(int, line)) # 此处调用你的目标函数,如 process_function(int_list) print(int_list)
方法2:列表推导式处理复杂格式
如果数据存在额外空格或异常格式,用列表推导式结合strip()清理后转换:
import csv with open('file.csv', 'r') as f: reader = csv.reader(f) for line in reader: int_list = [int(num.strip()) for num in line] # 调用目标函数 print(int_list)
二、换用更高效的文件格式
若CSV性能无法满足大数据量需求,可选择以下更适合数值型数据的存储格式:
1. NumPy .npy格式
专为数值数组设计,读写速度极快,支持变长列表:
import numpy as np # 写入数据(示例) data = [ [22,-14,-24,2,-26,18,20,-4,12,16,8,-6,-10], [20,12,-16,18,28,24,4,-22,26,8,-10,-14,2,6] ] np.save('data.npy', np.array(data, dtype=object)) # 读取数据 loaded_data = np.load('data.npy', allow_pickle=True) for line in loaded_data: print(line.tolist()) # 转换为普通整数列表使用
2. JSON格式
直接保留列表结构,Python内置json模块处理效率稳定:
import json # 写入数据(示例) data = [ [22,-14,-24,2,-26,18,20,-4,12,16,8,-6,-10], [20,12,-16,18,28,24,4,-22,26,8,-10,-14,2,6] ] with open('data.json', 'w') as f: json.dump(data, f) # 读取数据 with open('data.json', 'r') as f: loaded_data = json.load(f) for line in loaded_data: print(line) # 直接得到整数列表
3. Parquet格式
列式存储格式,压缩率高,超大规模数据场景下性能远超CSV:
先依赖安装:
pip install pyarrow
代码示例:
import pyarrow as pa import pyarrow.parquet as pq # 写入数据(示例) data = pa.array([ [22,-14,-24,2,-26,18,20,-4,12,16,8,-6,-10], [20,12,-16,18,28,24,4,-22,26,8,-10,-14,2,6] ], type=pa.list_(pa.int64())) table = pa.Table.from_arrays([data], names=['int_lists']) pq.write_table(table, 'data.parquet') # 读取数据 table = pq.read_table('data.parquet') loaded_data = table['int_lists'].to_pylist() for line in loaded_data: print(line)
内容的提问来源于stack exchange,提问作者marxim
相关产品推荐
相关产品推荐

