Чтение с помощью Python CSV, содержащего сложные строки

У меня есть файл, который я пытаюсь прочитать в Pandas DataFrame, в котором есть столбец со сложной строкой. Строка содержит вывод HTML и выглядит примерно так:

"<!DOCTYPE html PUBLIC \\"-//W3C//DTD HTML 4.0 Transitional//EN\\">\n', '<html>\n', '<head>\n', '<meta http-equiv=\\"Content-Type\\" content=\\"text/html; charset=UTF-8\\">\n', '<meta charset=\\"utf-8\\">\n', '<title>An Amazon.com Gift Card you sent has been redeemed</title>\n', '</head>\n', '<body>\n',

До сих пор я пробовал следующее:

df = pd.read_csv("<filename>",nrows = 50)

Что возвращает следующий .head():

Чтение с помощью Python CSV, содержащего сложные строки

Я пробовал использовать "escapechar= ", но, должно быть, неправильно понял синтаксис.

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

"241279","EMAIL_ADDRESS","EMAIL_ADDRESS","1607be7d4f2d66af","<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"URL\">
<html>
<head>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">
<meta charset=\"utf-8\">
<title>An Amazon.com Gift Card you sent has been redeemed</title>
</head>
<body>
<img width=\"1\" height=\"1\" src=\"URL\">
Greetings from Amazon.com,<br><br>

We wanted to let you know you that an Amazon.com Gift Card you sent has been redeemed.<br><br>
The gift card was emailed by Amazon to EMAIL_ADDRESS on DATE.<br><br>
Details:<br><br>

   Order # NUMBER<br>
   Sent to: EMAIL_ADDRESS<br>
   Date sent: DATE<br>
   Message: Here is a \"thank you\" for ... <br><br>

Please note: This email was sent from a notification-only address that cannot accept incoming email.
Please do not reply to this message.<br><br>
<img width=\"1\" height=\"1\" src=\"URL\">
</body>
</html>
","DATE 01:47:58","gmail","email",,,"An Amazon.com Gift Card you sent has been redeemed","DATE","DATE","f","23",,"EMAIL_ADDRESS","EMAIL_ADDRESS",,"f","EMAIL_ADDRESS","EMAIL_ADDRESS","9","f"

Возможно, попробуйте показать полную строку файла csv, который вы читаете (замените данные фиктивными значениями), и ожидаемый результат от .head () - это даст людям больше возможностей для работы

Milos Matovic 25.10.2018 17:20

Хорошее замечание, поэтому внесены поправки.

enixon4 25.10.2018 17:38

как вы генерируете этот CSV? Не похоже, что он был сгенерирован должным образом. quotechar не должен находиться в самой ячейке. Можете ли вы сгенерировать этот CSV с другим quotechar?

Ricky Kim 25.10.2018 17:45

Образец выглядит как дамп .readlines() файла CSV, а не как содержимое самого файла CSV. Какое содержимое вырезано и вставлено прямо из файла .CSV?

Mark Tolonen 25.10.2018 17:52

@RickyKim, к сожалению, я не являюсь генератором этого файла, иначе было бы намного чище.

enixon4 25.10.2018 17:59

@MarkTolonen, CSV-файл слишком велик для отображения в текстовых редакторах, которые я пробовал, поэтому я выбрал подход .readlines (). Всего около 77 ГБ. Однако я открыт для новых подходов к этому.

enixon4 25.10.2018 17:59

Сделайте что-нибудь вроде print(open('some.csv',encoding='utf8').read(1024)) и дайте нам этот контент.

Mark Tolonen 25.10.2018 18:15

@MarkTolonen - так исправлено.

enixon4 25.10.2018 18:45
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
8
89
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Поскольку quotechar по умолчанию для pd.read_csv - ", вам следует использовать quotechar = "'".

Это отличная идея, но, к сожалению, выход .head() не изменился.

enixon4 25.10.2018 17:07

каков ваш ожидаемый результат?

Ricky Kim 25.10.2018 17:08

DataFrame имеет следующие заголовки столбцов: [id, author_id, author_name, message_id, message]. Строку html необходимо вводить как одну ячейку в последнем столбце «сообщение» для каждой строки. Вывод IP HTML будет содержаться в одной ячейке.

enixon4 25.10.2018 17:10

О, я вижу. Итак, каково остальное содержимое csv? разделены ли они запятыми и используются ли символы кавычек (")?"

Ricky Kim 25.10.2018 17:22

Хороший вопрос. Я внес в OP полную строку вывода.

enixon4 25.10.2018 17:37
Ответ принят как подходящий

Данные имеют escape-символ \, который не используется по умолчанию. Со следующим:

df = pd.read_csv(<filename>,header=None,escapechar='\\')

Я получил:

>>> df
           0              1              2                 3   \
0  \n"241279"  EMAIL_ADDRESS  EMAIL_ADDRESS  1607be7d4f2d66af   

                                                  4              5      6   \
0  <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Tr...  DATE 01:47:58  gmail   

      7   8   9  ...  14  15             16             17  18  19  \
0  email NaN NaN ...  23 NaN  EMAIL_ADDRESS  EMAIL_ADDRESS NaN   f   

              20             21  22 23  
0  EMAIL_ADDRESS  EMAIL_ADDRESS   9  f  

[1 rows x 24 columns]

Отлично, @MarkTolonen, спасибо за ответ. Я отредактировал OP, чтобы включить изменение URL.

enixon4 25.10.2018 20:09

Другие вопросы по теме