首页 > 解决方案 > 如何根据长度选择 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 之间的行。

标签: pythonlistcsvfor-loopif-statement

解决方案


这是一个数据行长度从 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

推荐阅读