Как прочитать "битый" CSV?

При чтении CSV файла столкнулся с проблемой, что данные могут приходить битыми. Например:

"Job ID,""Server"",""Agent"",""Subclient"",""Backup type"",""Start time"",""End time"",""Duration(mins)"",""Application size"",""Job status"",""Failure reason"""

Для преобразования строк из файла в CSV использую:

csv_data = StringIO(data)

Данная строка парсится как единое значение, а не как заголовки. Как преодолеть проблему?


Ответы (1 шт):

Автор решения: Vitalizzare ушел в монастырь

В общем случае ошибки исправляются вручную, либо же запрашивается повторная выгрузка. Но в вашем случае это похоже на продублированную запись CSV файла. То есть, вам нужно дважды прочитать строки как данные в формате CSV. Например:

from io import StringIO
import csv

raw_data = '''\
"Job ID,""Server"",""Start time"",""Failure reason"""
"100500,""Some server"",""01:02:03,123"",""Something happened, but I don't know what"""
"142542,""Some other server"",""11:22:23,123"",""Nothing happened, it just didn't work"""
'''

with StringIO(raw_data) as file:
    data = [*map(lambda x: next(csv.reader(StringIO(x[0]))), csv.reader(file))]

print(data)

# [['Job ID', 'Server', 'Start time', 'Failure reason'], 
#  ['100500', 'Some server', '01:02:03,123', "Something happened, but I don't know what"], 
#  ['142542', 'Some other server', '11:22:23,123', "Nothing happened, it just didn't work"]]

Если у вас есть пайплайн выгрузки данных, то будет не лишним проверить, не дублируется ли там запись данных в формате CSV.

→ Ссылка