如何筛选CSV文件中x坐标处于157~480区间的行并导出
错误原因
- 读取CSV行时计算了判断条件
mask但完全没有使用,所有行不管是否符合x坐标范围都被追加到了xd/yd等列表中 - 对构造的
Xd数组使用了np.sort,该操作会对每一列单独排序,直接破坏了原始行内各字段的对应关系 - 后续仅对
xd做了筛选,yd/zd/cd/rhod仍为全量数据,长度和筛选后的xd不一致,写入时必然出现错位 - 原始代码存在语法错误:
rows =后无赋值内容,直接运行会报错
解决方案
你需要在读取时就判断x坐标是否符合要求,仅保留符合条件的整行数据,避免后续单独处理各字段破坏对应关系。
方案1:原生csv库实现(无额外依赖)
逐行读取判断,符合条件直接写入目标文件,不需要加载全量数据,内存占用低:
import csv import os meanflowdata = 'fieldlp3.csv' f = os.path.splitext(os.path.basename(meanflowdata)) outputfile = f[0] + '_cut' + f[1] range_start = 157.0 range_end = 480.0 with open(meanflowdata, 'r', encoding='utf-8') as infile, \ open(outputfile, 'w', encoding='utf-8', newline='') as outfile: reader = csv.reader(infile, delimiter=',') writer = csv.writer(outfile, delimiter=',') for row in reader: if len(row) > 2: try: x_val = float(row[0]) # 满足157 < x < 480的条件就写入整行 if range_start < x_val < range_end: writer.writerow(row) except ValueError: # 跳过表头或者非数值的行,不需要的话可以删掉这个异常处理 continue
方案2:pandas极简实现
如果允许使用第三方库,几行代码即可完成,逻辑更清晰:
import pandas as pd import os meanflowdata = 'fieldlp3.csv' f = os.path.splitext(os.path.basename(meanflowdata)) outputfile = f[0] + '_cut' + f[1] df = pd.read_csv(meanflowdata, header=None) # 如果有表头就去掉header=None # 筛选第一列(x坐标)符合157<x<480的行,直接写入新文件 df_filtered = df[(df.iloc[:,0] > 157) & (df.iloc[:,0] < 480)] df_filtered.to_csv(outputfile, header=False, index=False)
两种方案都直接保留整行的字段对应关系,完全不会出现错位问题。
内容的提问来源于stack exchange,提问作者Federica Tonti
相关产品推荐
相关产品推荐

