Python读取txt/csv表格数据最佳实践:多列拆分与首行跳过
高效读取txt/csv文件并拆分任意列至数组(跳过首行)
你的现有写法有几个明显的效率问题:每次循环重复调用split()做冗余计算,手动处理文件没做自动关闭,而且对不同分隔符(比如多空格、制表符)兼容性差,大文件下一次性把所有行加载到内存也会拖慢速度。下面用Python标准库和常用第三方库给出更高效的解决方案:
方法一:用标准库csv(轻量无依赖)
适合不想额外装库的场景,能自动处理各种分隔符,逐行读取内存占用低:
import csv # 按需定义存储数组,要几列就建几个列表 x_pareto = [] y_pareto = [] # z_pareto = [] # 需要第三列就解开注释 # 用with上下文自动关文件,不用手动写close() with open("Pareto Front.txt", "r") as f: # skipinitialspace=True会自动跳过分隔符后面的空格,适配多空格分隔的情况 reader = csv.reader(f, delimiter=" ", skipinitialspace=True) next(reader) # 直接跳过首行 for row in reader: # 按列索引取数据转成float,按需加更多列 x_pareto.append(float(row[0])) y_pareto.append(float(row[1])) # z_pareto.append(float(row[2]))
如果是逗号分隔的csv文件,把delimiter=" "改成delimiter=","就行(或者直接省略,csv.reader默认用逗号当分隔符)。
方法二:用pandas(复杂场景/大文件首选)
pandas底层是C实现的,处理大文件速度比纯Python循环快得多,代码也更简洁,还能自动识别各种分隔符:
import pandas as pd # skiprows=1跳过首行,sep='\s+'匹配任意数量的空格(适配txt),csv文件直接去掉sep参数 df = pd.read_csv("Pareto Front.txt", skiprows=1, sep='\s+', header=None) # 提取任意列转成列表,比如取第0、1列 x_pareto = df.iloc[:, 0].tolist() y_pareto = df.iloc[:, 1].tolist() # 要转numpy数组的话用.values:x_pareto = df.iloc[:, 0].values
这两种方法都避免了冗余的split()操作,能灵活处理任意数量的列,大文件场景下内存和速度表现都远优于你原来的代码。
内容的提问来源于stack exchange,提问作者user17885178
相关产品推荐
相关产品推荐

