python - 如何根据长度选择 csv 文件中的行?
问题描述
我正在尝试根据行的长度来选择行。我的 csv 文件中的某些行有 5 个项目,有些有 20 个项目,有些有 40 个。如果它们的长度在 24 到 34 之间,我想收集所有行。所以我尝试了以下代码:
my_path = r'c:\data\FF\Desktop\my_files'
for file in os.listdir(my_path):
path_file = os.path.join(my_path, file)
with open(path_file, 'r') as output:
reader = csv.reader(output, delimiter = ',')
read = [row for row in reader if row]
for row in read:
if len(row) > 24 or len(row) < 34:
if row[9] == '3080':
print(row[0] + ',' + row[24] + ',' + row[25] + ','
+ row[26] + ',' + row[27] + ',' + row[28] + ',' + row[29]
+ ',' + row[30] + ',' + row[31] + ',' + row[32] + ',' + row[33] + ','
+ row[34])
我收到以下错误:
File "C:\data\FF\Desktop\Python\PythongMySQL\untitled2.py", line 15, in <module>
if row[9] == '3080':
IndexError: list index out of range
我希望得到几行长度在 24 到 34 之间的行。
解决方案
这是一个数据行长度从 20 到 39 不等的示例。只有长度在 24 到 34 之间且列 9 == 3080 的行才会打印:
输入.csv
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
0,1,2,3,4,5,6,7,8,3080,10,11,12,13,14,15,16,17,18,19,20,21
0,1,2,3,4,5,6,7,8,3080,10,11,12,13,14,15,16,17,18,19,20,21,22
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
0,1,2,3,4,5,6,7,8,3080,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
0,1,2,3,4,5,6,7,8,3080,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32
0,1,2,3,4,5,6,7,8,3080,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33
0,1,2,3,4,5,6,7,8,3080,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37
0,1,2,3,4,5,6,7,8,3080,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38
测试.py
import csv
with open('input.csv','r',newline='') as f:
r = csv.reader(f)
for row in r:
if 24 <= len(row) <= 34:
if row[9] == '3080':
print(','.join([row[0]] + row[24:]))
输出:
0,24,25,26,27,28,29,30,31
0,24,25,26,27,28,29,30,31,32
0,24,25,26,27,28,29,30,31,32,33
推荐阅读
- java - 在 IntelliJ 中并行运行同一个 gradle 任务
- java - Java中实际参数列表和形式参数列表的长度不同
- c# - 在字典 C# 中使用 LinkedList?以及如何实现它的操作?
- r - 'sentimentr' 包有意大利语词典吗?
- sql - 如何从 DataGrip 执行 PL/SQL 过程
- python - 如何在python中以不同颜色显示从负值到正值的图像值
- java - 如何在 Spring Boot 中验证服务层中的数据
- python - 扫雷 AI 将地雷标记为安全地点
- php - Symfony:控制 security.yaml 外部的路由
- python - 将序列化的 protobuf 输出转换为 python 字典