【问题标题】:Cleaning CSV file with python skips certain rows用 python 清理 CSV 文件会跳过某些行
【发布时间】:2020-12-08 22:10:55
【问题描述】:

我在表单的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']

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

【问题讨论】:

    标签: python-3.x csv data-cleaning


    【解决方案1】:

    我选择在处理代码之前打印出每一行,这样我们就可以准确地看到 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']
    

    【讨论】:

    • 这根本不是异常结果。在 CSV 规范中,一个单元格的值可以是一个包含逗号和换行符的字符串,如果它包含在引号中。
    • 另外,最好在", " 上进行拆分,而不是替换逗号并在空格上拆分,因为如果数据中有合法空格,后者会中断。
    猜你喜欢
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多