Чтение CSV-файла в Pandas с двойными «двойными кавычками» и запятыми - PullRequest
2 голосов
/ 10 октября 2019

Мне нужно прочитать CSV-файл в Pandas, который содержит данные в следующем формате (двойные «двойные кавычки» для одного из полей)

"column1","column2","column3","column4"
"10",""AB"","ABCD","abcd"
"11",""CD,E"","CDEF","abcd"
"12",""WER"","DEF,31","abcd"

Я ожидаю, что правильно проанализированный фрейм данных будет похож на

column1  column2  column3   column4
10       AB       ABCD      abcd
11       "CD,E"   CDEF      abcd
12       WER      "DEF,31"  abcd

Я пытался использовать

df= pd.read_csv('sample.txt',quotechar='""', quoting=csv.QUOTE_ALL)

и

df= pd.read_csv('sample.txt',quotechar='"', quoting=csv.QUOTE_ALL)

, но получал

TypeError: "quotechar" must be a 1-character string

и

pandas.errors.ParserError: Error tokenizing data. C error: Expected 4 fields in line 3, saw 5

Есть ли способ прочитать этот файл без предварительной обработки и удаления двойных «двойных кавычек» в данных?

Когда у column2 нет запятых, я могу читать данные с некоторыми дополнительными кавычками, которые я могу заменить на дальнейших этапах обработки. У меня проблемы с разбором, только когда у column2 запятая.

Ответы [ 2 ]

1 голос
/ 11 октября 2019

Это должно помочь вам

df =pd.read_csv("so.txt",encoding='utf-8', names=["column1","column2","column3","column4"],sep='",',header=0,quoting=csv.QUOTE_ALL)
1 голос
/ 10 октября 2019

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

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

import re
from io import StringIO

data = """
"column1","column2","column3","column4"
"10",""AB"","ABCD","abcd"
"11",""CD,E"","CDEF","abcd"
"12",""WER"","DEF,31","abcd"
"""

data = re.sub('(?<!^)"(?!,")(?<!,")(?!$)', '\\"', data, flags=re.M)

pd.read_csv(StringIO(data), escapechar='\\')

Если вы читаете из файла, то:

with open('path/to/csv', 'r') as f:
    data = re.sub('(?<!^)"(?!,")(?<!,")(?!$)', '\\"', f.read(), flags=re.M)
    df = pd.read_csv(StringIO(data), escapechar='\\')

Регулярное выражение ищет кавычки, которых нет в начале (?<!^) или конец (?!$) каждой строки, а также для кавычек, которые не являются частью начала (?<!,") и конца (?!,") каждого поля

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