Python CSV数据转换问题:基于前后值的条件转换实现
问题解决:CSV数值条件转换(同时处理前后元素)
需求回顾
- 转换规则:若CSV中某数值处于
1-4区间,需对其前一个和后一个数值应用转换:- 目标数值为
8-10→ 减2 - 目标数值为
5-7→ 减1
- 目标数值为
- 示例:输入
8,1,8→ 期望输出6,1,6(中间的1触发规则,前后的8均减2)
原代码问题
原逻辑仅实现了「前一个数值是1-4时修改当前数值」,未覆盖「当前数值是1-4时修改前后数值」的核心需求;且直接修改原字符串列表,可能导致后续迭代时使用已修改的值引发错误。
修改后的代码
import csv input_filename = 'updated_zeros.csv' output_filename = 'updated_zeros.csv' # 读取CSV并转换为整数列表(避免字符串操作的冗余与修改冲突) with open(input_filename, mode='r') as csv_file: csv_reader = csv.reader(csv_file) rows = [] for row in csv_reader: int_row = [] for val in row: # 处理空值,这里默认转为0,可根据实际需求调整 int_row.append(int(val.strip()) if val.strip() else 0) rows.append(int_row) # 应用转换规则 for row in rows: row_len = len(row) # 遍历每个元素的索引与值,定位触发规则的元素 for idx, current_val in enumerate(row): if 1 <= current_val <= 4: # 处理前一个元素(需确保索引合法) if idx > 0: prev_val = row[idx-1] if 8 <= prev_val <= 10: row[idx-1] = prev_val - 2 elif 5 <= prev_val <= 7: row[idx-1] = prev_val - 1 # 处理后一个元素(需确保索引合法) if idx < row_len - 1: next_val = row[idx+1] if 8 <= next_val <= 10: row[idx+1] = next_val - 2 elif 5 <= next_val <= 7: row[idx+1] = next_val - 1 # 将整数列表转回字符串并写入CSV with open(output_filename, mode='w', newline='') as csv_file: csv_writer = csv.writer(csv_file) string_rows = [[str(val) for val in row] for row in rows] csv_writer.writerows(string_rows) # 打印转换结果 with open(output_filename, "r") as file: for line in file: print(' '.join(line.strip().split(','))) print(f'转换后的数据已保存到 {output_filename}')
关键修改说明
- 整数列表预处理:先将每行字符串转为整数,避免反复类型转换,同时防止迭代时修改原列表导致的逻辑冲突。
- 索引与值同步遍历:使用
enumerate同时获取元素索引和值,精准定位需要修改的前后元素。 - 边界条件防护:通过
idx > 0和idx < row_len -1判断,避免越界访问列表元素。 - 规则触发逻辑修正:改为当当前值处于1-4区间时,主动修改前后符合条件的数值,完全匹配需求。
内容的提问来源于stack exchange,提问作者Circulartextapps
相关产品推荐
相关产品推荐

