Чтение csv файла с разделениями запятыми, при том, что в файле присутствуют нежелательные запятые

столкнулся со следующей проблемой: при чтении csv-файла в виде таблицы дефолтно разделителем считаются запятые, однако в моем файле присутствуют дополнительные запятые, которые мешают правильно разделить объекты. в каждой строке читаемой таблицы присутствует 7 объектов, но на шестом чаще всего имеется запятая (для примера - пусть в таблице содержатся название фильма, ссылка на него и жанр. С названием и ссылкой все в порядке, но жанров чаще всего дается несколько, вроде драма,комедия,боевик. в данном случае на третьем объекта имеются запятые, которые мешают правильному разделению). В целом, мне можно просто вытащить первые 4 объекта, а остальные, включаю жанры, просто не считывать. Подскажите, пожалуйста, как это сделать.


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

Автор решения: CrazyElf

Если "лишние" поля можно просто отбросить, то используйте параметр usecols=. Пример:

import pandas as pd

with open("test.csv", "w") as f:
    f.writelines(['1,2,3,4,5\n','1,2,3,4\n','1,2,3,4,5,6\n','1,2,3\n'])

df = pd.read_csv("test.csv", sep=',', usecols=[0,1,2])
df

Вывод:

    1   2   3
0   1   2   3
1   1   2   3
2   1   2   3

Как видите, "лишние" поля просто обрезались как в шапке, так и в теле таблицы.

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

import pandas as pd

with open("test.csv", "w") as f:
    f.writelines(['1,2,3,,,,,,,\n','1,2,3,4\n','1,2,3,4,5,6\n','1,2,3\n'])
    
df = pd.read_csv("test.csv", sep=',')
df

Вывод:

    1   2   3   Unnamed: 3  Unnamed: 4  Unnamed: 5  Unnamed: 6  Unnamed: 7  Unnamed: 8  Unnamed: 9
0   1   2   3   4.0 NaN NaN NaN NaN NaN NaN
1   1   2   3   4.0 5.0 6.0 NaN NaN NaN NaN
2   1   2   3   NaN NaN NaN NaN NaN NaN NaN

Но самое правильное решение - считать и перезаписать csv файл, применив какое-нибудь "экранирование" перед "лишними" запятыми, код мне пока не хочется писать.

→ Ссылка