Чтение CSV-файла, который содержит две двойные кавычки внутри кавычек и разрывы строк

У меня проблема в том, что у меня есть большой файл, который я хочу прочитать на Python, и он выглядит так:

"2019-10-09 10:11:09","NICK","Hello, how are you
today? I'm like ""weather"", often changing."

Я хочу прочитать этот файл в dataframe, который будет выглядеть так:

col1                  col2          col3
2019-10-09 09:32:09   NICK          Hello, how are you today? I'm like ""weather"", often changing.

У меня мало проблем с этим. Во-первых, существует проблема, заключающаяся в том, что мой разделитель - ',' который также находится внутри некоторых сообщений из col3. Вторая проблема заключается в том, что внутри некоторых сообщений от col3 есть разрыв строки, который я не знаю, как обрабатывать (как в примере после 'you'). И последняя проблема заключается в том, что внутри сообщений от col3 также есть две двойные кавычки "" "" ", которые представляют кавычку внутри сообщения.

Я пытался прочитать этот файл с:

with open('/data/myfile.csv', 'r', encoding='utf-8') as csvfile:
    df = pd.read_csv(csvfile, sep=",", quotechar='"', escapechar='\')

К сожалению, этот метод не работает. Я не знаю, что из этих трех вещей, которые я объяснил, вызывает проблему. Он показал мне ошибки, что он ожидал три столбца, но было немного больше.

РЕДАКТИРОВАТЬ: Есть другая проблема, потому что она все еще показывает мне эту ошибку:

Error tokenizing data. C error: Expected 3 fields in line 60, saw 5

Когда я смотрю на файл, я не знаю, как он интерпретирует строки, потому что я получил в сообщениях из col3 несколько строк разрыва внутри. Как я могу напечатать эту точную строку, которая вызывает проблемы?

EDIT2: я использовал этот код в терминале:

sed -n 60p myfile.csv

И это напечатало пустую строку. Так что я сделал это также со строками в несколько строк до и после. Это выглядит как:

"2019-10-09 10:11:09","som1","This isn't this.
It's like this, and this.

And as my opinions is this.

Finally, it's the end."

РЕДАКТИРОВАТЬ3: @Boendal был прав. Эта строка, которую я включил, не вызывает проблемы. Теперь я отредактировал код для:

with open('opinions-ml.csv', 'r', encoding='utf-8') as csvfile:
    df = pd.read_csv(csvfile, names=['col1', 'col2', 'col3'], sep=",", quotechar='"', escapechar='\')

И я обнаружил, что проблема вызвана такими строками:

"2019-10-09 10:11:09","NICK","This is some text "and this, is quote" and it is also text
Awww. and, there was, line break"

Python читает это как dataframe, который выглядит следующим образом:

col1                  col2          col3
2019-10-09 09:32:09   NICK          This is some text and this
Awww. and             there was     line break

Вы думаете, что есть шанс что-то сделать с этой проблемой? Может быть, с помощью регулярных выражений? Или я должен вернуться к провайдеру файлов, чтобы это исправить?

EDIT4: И еще одна строка:

"2019-10-09 10:11:09","NICK","This is some text "and this is quote" and it is also text
Awww. and there, was line break"

Python читает это как dataframe, который выглядит следующим образом:

col1                  col2            col3
2019-10-09 09:32:09   NICK            This is some text and this is quote" and it is also text
Awww. and there       was line break  NaN

Всего 2 ответа


По мне, CSV диалект может быть полезным. следующий код производит правильный вывод.

import pandas as pd
import csv

csv.register_dialect('mydialect', delimiter=',', quoting=csv.QUOTE_ALL, doublequote=True)
df = pd.read_csv('test.csv', dialect='mydialect')
df

Решение-2: переформатировать данные

  • Первые 2 столбца не нуждаются в обработке.
  • третий столбец должен быть экранирован.
  • разделите строку на (запятая) и экранируйте значение из третьего индекса.

    import csv
    with open('test.csv') as infile, open('reformated_data.csv', 'w', newline='') as outfile:
    
        outputWriter = csv.writer(outfile, delimiter=',',
                                escapechar='\', quoting=csv.QUOTE_NONE)
        for line in infile:
            line = line.split(',')
            col12 = line[0:2]
            col3 = ''.join(line[2:]).encode("unicode_escape").decode("utf-8")
            outputWriter.writerow(col12 + [col3])
    

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html https://docs.python.org/3/library/csv.html#dialects-and-formatting-parameters


Как я уже говорил вам в комментарии, ваша проблема в том, что в ""weather"" " не экранируется. Поэтому панды интерпретируют его как кавычку. Насколько мне известно, не существует способа предотвратить этот экранирование для предварительной обработки вашего файла. и поменяйте ""weaterh"" на ""weather"" .

Один из способов сделать это:

with open('/data/myfile.csv', 'r', encoding='utf-8') as f_in, open("/data/preprocessed.csv", 'w') as f_out:
    for line in f_in:
        line = line.replace('""', '\"\"')
        f_out.write(line)

Это изменение

"2019-10-09 10:11:09","NICK","Hello, how are you
today? I'm like ""weather"", often changing."
"2019-10-09 10:11:09","som1","This isn't this.
It's like this, and this.

And as my opinions is this.

Finally, it's the end."

в

"2019-10-09 10:11:09","NICK","Hello, how are you
today? I'm like ""weather"", often changing."
"2019-10-09 10:11:09","som1","This isn't this.
It's like this, and this.

And as my opinions is this.

Finally, it's the end."

Затем вы можете создать с ним фрейм данных (с кодом, который вы разместили выше, и с новым созданным файлом), и он будет выглядеть так:

                  col1  col2                                                                                                  col3
0  2019-10-09 10:11:09  NICK                                      Hello, how are you
today? I'm like ""weather"", often changing.
1  2019-10-09 10:11:09  som1  This isn't this.
It's like this, and this.

And as my opinions is this.

Finally, it's the end.

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


Есть идеи?

10000