Проблемы с чтением CSV-файла с запятыми и символами в pandas

Я пытаюсь прочитать csv-файл с помощью панд, и файл имеет столбец под названием теги, которые состоят из пользовательских тегов и имеют теги, такие как -,",", 1950-х годов, 16-го века. Поскольку они предоставляются Пользователем, есть много специальных символов, которые также вводятся по ошибке. Проблема в том, что я не могу открыть файл csv с помощью pandas read_csv. Он показывает ошибку: Cparser, ошибка токенизации данных. Может кто-нибудь помочь мне с чтением csv-файла в панд?

1 ответов


ОК. Начиная с плохо отформатированного CSV, мы не можем прочитать:

>>> !cat unquoted.csv
1950's,xyz.nl/user_003,bad, 123
17th,red,flower,xyz.nl/user_001,good,203
"",xyz.nl/user_239,not very,345
>>> pd.read_csv("unquoted.csv", header=None)
Traceback (most recent call last):
  File "<ipython-input-40-7d9aadb2fad5>", line 1, in <module>
    pd.read_csv("unquoted.csv", header=None)
[...]
  File "parser.pyx", line 1572, in pandas._parser.raise_parser_error (pandas/src/parser.c:17041)
CParserError: Error tokenizing data. C error: Expected 4 fields in line 2, saw 6

мы можем сделать более приятную версию, воспользовавшись тем, что последние три столбца хорошо себя ведут:

import csv

with open("unquoted.csv", "rb") as infile, open("quoted.csv", "wb") as outfile:
    reader = csv.reader(infile)
    writer = csv.writer(outfile)
    for line in reader:
        newline = [','.join(line[:-3])] + line[-3:]
        writer.writerow(newline)

которая производит

>>> !cat quoted.csv
1950's,xyz.nl/user_003,bad, 123
"17th,red,flower",xyz.nl/user_001,good,203
,xyz.nl/user_239,not very,345

и тогда мы можем прочитать его:

>>> pd.read_csv("quoted.csv", header=None)
                 0                1         2    3
0           1950's  xyz.nl/user_003       bad  123
1  17th,red,flower  xyz.nl/user_001      good  203
2              NaN  xyz.nl/user_239  not very  345

Я бы посмотрел на исправление этой проблемы в источнике и получение данных в приемлемом формате. В таких трюках не должно быть необходимости, и это было бы очень легко сделать. невозможно починить.