使用 python 清理 CSV 文件会跳过某些行

Cleaning CSV file with python skips certain rows

我在 csv 格式的文件中有数据

karthiga, 21, 9,
karthiga, 59, 7,
karthiga, 74, 7,
karthiga, 120, 7,
karthiga, 178, 7,
karthiga, 210, 7,
karthiga, 232, 6,
karthiga, 233, 6,
karthiga, 249, 8,
karthiga, 269, 10,
karthiga, 721, 7,
karthiga, 853, 7,
karthiga, 857, 10,
karthiga, 11123, 7,
karthiga, 11759, 5,
karthiga, 12365, 8,
karthiga, 14227, 8,
karthiga, 14397, 7,
karthiga, 14713, 10,
RedvelvetDaisuki, 1, 8,
RedvelvetDaisuki, 16, 4,
RedvelvetDaisuki, 19, 9,
RedvelvetDaisuki, 228, 5,
RedvelvetDaisuki, 237, 7,
RedvelvetDaisuki, 239, 7,
RedvelvetDaisuki, 245, 8,
RedvelvetDaisuki, 251, 4,
RedvelvetDaisuki, 268, 9,
RedvelvetDaisuki, 269, 6,
RedvelvetDaisuki, 270, 4,
RedvelvetDaisuki, 323, 7,
RedvelvetDaisuki, 777, 3,
RedvelvetDaisuki, 849, 5,
"
, , ,
RedvelvetDaisuki, 853, 9,
RedvelvetDaisuki, 877, 8,
RedvelvetDaisuki, 885, 5,
RedvelvetDaisuki, 934, 8,
RedvelvetDaisuki, 936, 7,
RedvelvetDaisuki, 1210, 9,
RedvelvetDaisuki, 1216, 6,
"
, , ,
RedvelvetDaisuki, 1412, 9,
RedvelvetDaisuki, 1425, 10,
RedvelvetDaisuki, 1535, 10,
RedvelvetDaisuki, 1562, 3,
RedvelvetDaisuki, 1575, 10,
RedvelvetDaisuki, 1639, 8,
RedvelvetDaisuki, 1686, 7,
RedvelvetDaisuki, 1689, 4,
RedvelvetDaisuki, 1698, 8,
RedvelvetDaisuki, 1735, 9,
RedvelvetDaisuki, 1829, 8,
RedvelvetDaisuki, 1887, 6,
RedvelvetDaisuki, 1953, 6,
RedvelvetDaisuki, 9479, 3,
RedvelvetDaisuki, 9587, 5,
RedvelvetDaisuki, 9656, 6,
RedvelvetDaisuki, 9675, 8,
RedvelvetDaisuki, 9756, 9,
"
, , ,
RedvelvetDaisuki, 9919, 6,
RedvelvetDaisuki, 9926, 10,
RedvelvetDaisuki, 9989, 5,
RedvelvetDaisuki, 10020, 8,
RedvelvetDaisuki, 10029, 10,
RedvelvetDaisuki, 34599, 10,
RedvelvetDaisuki, 34612, 9,
RedvelvetDaisuki, 34636, 7,
RedvelvetDaisuki, 34712, 7,
RedvelvetDaisuki, 34822, 5,
RedvelvetDaisuki, 34881, 6,
RedvelvetDaisuki, 34902, 7,
Damonashu, 272, 8,
Damonashu, 274, 7,
Damonashu, 298, 4,
Damonashu, 317, 6,
Damonashu, 323, 9,
Damonashu, 335, 5,
Damonashu, 339, 6,
Damonashu, 387, 7,

我想删除所有只有 ", , , 的行。所以,我写了一些 python 脚本来做到这一点

from csv import reader

with open("file.csv") as read_obj:
    csv_reader = reader(read_obj)

    for row in csv_reader:
        row = row[:-1]
        if len(row) == 3 and row[0] != '':
            print(row)

打印出

['karthiga', ' 21', ' 9']
['karthiga', ' 59', ' 7']
['karthiga', ' 74', ' 7']
['karthiga', ' 120', ' 7']
['karthiga', ' 178', ' 7']
['karthiga', ' 210', ' 7']
['karthiga', ' 232', ' 6']
['karthiga', ' 233', ' 6']
['karthiga', ' 249', ' 8']
['karthiga', ' 269', ' 10']
['karthiga', ' 721', ' 7']
['karthiga', ' 853', ' 7']
['karthiga', ' 857', ' 10']
['karthiga', ' 11123', ' 7']
['karthiga', ' 11759', ' 5']
['karthiga', ' 12365', ' 8']
['karthiga', ' 14227', ' 8']
['karthiga', ' 14397', ' 7']
['karthiga', ' 14713', ' 10']
['RedvelvetDaisuki', ' 1', ' 8']
['RedvelvetDaisuki', ' 16', ' 4']
['RedvelvetDaisuki', ' 19', ' 9']
['RedvelvetDaisuki', ' 228', ' 5']
['RedvelvetDaisuki', ' 237', ' 7']
['RedvelvetDaisuki', ' 239', ' 7']
['RedvelvetDaisuki', ' 245', ' 8']
['RedvelvetDaisuki', ' 251', ' 4']
['RedvelvetDaisuki', ' 268', ' 9']
['RedvelvetDaisuki', ' 269', ' 6']
['RedvelvetDaisuki', ' 270', ' 4']
['RedvelvetDaisuki', ' 323', ' 7']
['RedvelvetDaisuki', ' 777', ' 3']
['RedvelvetDaisuki', ' 849', ' 5']
['RedvelvetDaisuki', ' 1412', ' 9']
['RedvelvetDaisuki', ' 1425', ' 10']
['RedvelvetDaisuki', ' 1535', ' 10']
['RedvelvetDaisuki', ' 1562', ' 3']
['RedvelvetDaisuki', ' 1575', ' 10']
['RedvelvetDaisuki', ' 1639', ' 8']
['RedvelvetDaisuki', ' 1686', ' 7']
['RedvelvetDaisuki', ' 1689', ' 4']
['RedvelvetDaisuki', ' 1698', ' 8']
['RedvelvetDaisuki', ' 1735', ' 9']
['RedvelvetDaisuki', ' 1829', ' 8']
['RedvelvetDaisuki', ' 1887', ' 6']
['RedvelvetDaisuki', ' 1953', ' 6']
['RedvelvetDaisuki', ' 9479', ' 3']
['RedvelvetDaisuki', ' 9587', ' 5']
['RedvelvetDaisuki', ' 9656', ' 6']
['RedvelvetDaisuki', ' 9675', ' 8']
['RedvelvetDaisuki', ' 9756', ' 9']

不幸的是,我不知道为什么它会中途停止...它打印的最后一个条目之后还有更多条目,但由于某种原因,它只是停止而没有给我任何类型的错误或任何东西...可以有人给我解释一下这是怎么回事吗?

我选择让代码在处理之前打印出每一行,这样我们就可以准确地看到 csv_reader 读入的内容。

由于 csv_reader 解析逗号、换行符等的方式,我们最终会得到一些异常结果。我显示的结果是 RedvelvetDaisuki, 9756, 9,(以及它后面的那一行),但我们在数据的其他空白处也得到了类似的结果。

['RedvelvetDaisuki', ' 9675', ' 8', '']
['RedvelvetDaisuki', ' 9756', ' 9', '']
['\n, , ,\nRedvelvetDaisuki, 9919, 6,\nRedvelvetDaisuki, 9926, 10,\nRedvelvetDaisuki, 9989, 5,\nRedvelvetDaisuki, 10020, 8,\nRedvelvetDaisuki, 10029, 10,\nRedvelvetDaisuki, 34599, 10,\nRedvelvetDaisuki, 34612, 9,\nRedvelvetDaisuki, 34636, 7,\nRedvelvetDaisuki, 34712, 7,\nRedvelvetDaisuki, 34822, 5,\nRedvelvetDaisuki, 34881, 6,\nRedvelvetDaisuki, 34902, 7,\nDamonashu, 272, 8,\nDamonashu, 274, 7,\nDamonashu, 298, 4,\nDamonashu, 317, 6,\nDamonashu, 323, 9,\nDamonashu, 335, 5,\nDamonashu, 339, 6,\nDamonashu, 387, 7,']

解决此问题的一种技术可能是解析数据并去除所有具有异常数据的行,而根本不使用 csv_reader:

open("file.csv") as read_obj: 
    for line in read_obj: 
        if '"' in line or ', , ,' in line: 
            continue 
        else: 
            line = line.strip().replace(',', '').split(' ') 
            print(line) 

产生:

['karthiga', '21', '9']
['karthiga', '59', '7']
['karthiga', '74', '7']
['karthiga', '120', '7']
['karthiga', '178', '7']
['karthiga', '210', '7']
['karthiga', '232', '6']
['karthiga', '233', '6']
['karthiga', '249', '8']
['karthiga', '269', '10']
['karthiga', '721', '7']
['karthiga', '853', '7']
['karthiga', '857', '10']
['karthiga', '11123', '7']
['karthiga', '11759', '5']
['karthiga', '12365', '8']
['karthiga', '14227', '8']
['karthiga', '14397', '7']
['karthiga', '14713', '10']
['RedvelvetDaisuki', '1', '8']
['RedvelvetDaisuki', '16', '4']
['RedvelvetDaisuki', '19', '9']
['RedvelvetDaisuki', '228', '5']
['RedvelvetDaisuki', '237', '7']
['RedvelvetDaisuki', '239', '7']
['RedvelvetDaisuki', '245', '8']
['RedvelvetDaisuki', '251', '4']
['RedvelvetDaisuki', '268', '9']
['RedvelvetDaisuki', '269', '6']
['RedvelvetDaisuki', '270', '4']
['RedvelvetDaisuki', '323', '7']
['RedvelvetDaisuki', '777', '3']
['RedvelvetDaisuki', '849', '5']
['RedvelvetDaisuki', '853', '9']
['RedvelvetDaisuki', '877', '8']
['RedvelvetDaisuki', '885', '5']
['RedvelvetDaisuki', '934', '8']
['RedvelvetDaisuki', '936', '7']
['RedvelvetDaisuki', '1210', '9']
['RedvelvetDaisuki', '1216', '6']
['RedvelvetDaisuki', '1412', '9']
['RedvelvetDaisuki', '1425', '10']
['RedvelvetDaisuki', '1535', '10']
['RedvelvetDaisuki', '1562', '3']
['RedvelvetDaisuki', '1575', '10']
['RedvelvetDaisuki', '1639', '8']
['RedvelvetDaisuki', '1686', '7']
['RedvelvetDaisuki', '1689', '4']
['RedvelvetDaisuki', '1698', '8']
['RedvelvetDaisuki', '1735', '9']
['RedvelvetDaisuki', '1829', '8']
['RedvelvetDaisuki', '1887', '6']
['RedvelvetDaisuki', '1953', '6']
['RedvelvetDaisuki', '9479', '3']
['RedvelvetDaisuki', '9587', '5']
['RedvelvetDaisuki', '9656', '6']
['RedvelvetDaisuki', '9675', '8']
['RedvelvetDaisuki', '9756', '9']
['RedvelvetDaisuki', '9919', '6']
['RedvelvetDaisuki', '9926', '10']
['RedvelvetDaisuki', '9989', '5']
['RedvelvetDaisuki', '10020', '8']
['RedvelvetDaisuki', '10029', '10']
['RedvelvetDaisuki', '34599', '10']
['RedvelvetDaisuki', '34612', '9']
['RedvelvetDaisuki', '34636', '7']
['RedvelvetDaisuki', '34712', '7']
['RedvelvetDaisuki', '34822', '5']
['RedvelvetDaisuki', '34881', '6']
['RedvelvetDaisuki', '34902', '7']
['Damonashu', '272', '8']
['Damonashu', '274', '7']
['Damonashu', '298', '4']
['Damonashu', '317', '6']
['Damonashu', '323', '9']
['Damonashu', '335', '5']
['Damonashu', '339', '6']
['Damonashu', '387', '7']