Чтение CSV-файла, который включает две двойные кавычки внутри кавычек и разрывы строк - PullRequest
1 голос
/ 16 января 2020

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

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

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

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."

EDIT3: @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 читает это как фрейм данных, который выглядит так:

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 читает это как фрейм данных, который выглядит следующим образом:

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 ]

1 голос
/ 16 января 2020

По мне, 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 и-форматирование-параметры

0 голосов
/ 16 января 2020

Как я уже говорил в комментарии, ваша проблема в том, что в ""weather"" " не экранированы. Поэтому pandas интерпретируйте это как цитату. Насколько мне известно, нет никакого способа предотвратить выход этого файла для предварительной обработки файла и изменения ""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\ntoday? I'm like ""weather"", often changing.
1  2019-10-09 10:11:09  som1  This isn't this.\nIt's like this, and this.\n\nAnd as my opinions is this.\n\nFinally, it's the end.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...