У меня проблема в том, что у меня есть большой файл, который я хочу прочитать на 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: переформатировать данные
разделите строку на (запятая) и экранируйте значение из третьего индекса.
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.
Вы разместили только одну строку данных, могут быть и другие ошибки, о которых вы не знали. Я думаю, что одинарные кавычки в ваших данных могут быть большей проблемой, чем двойные кавычки, но попробуйте и посмотрите, как это происходит.