Панды Невозможно прочитать CSV-файл с помощью панд, с дополнительной кавычкой - PullRequest
1 голос
/ 15 октября 2019

У меня есть следующий CSV со следующими записями

"column1" |"Column2" |«Колонка3» |"Column4" |"column5"
"123" |«sometext», «this somedata», «8 дюймов», «hello»

Проблема возникает, когда я пытаюсь прочитать 8 inches", я не могу прочитать CSV, используя read_csv().

Pandas.read_csv(io.BytesIO(obj['Body'].read()), sep="|",
                                      quoting=1,
                                      engine='c', error_bad_lines=False, warn_bad_lines=True,
                                      encoding="utf-8", converters=pandas_config['converters'],skipinitialspace=True,escapechar='\"')

Есть ли способ обработки кавычки внутри ячейки.

Ответы [ 2 ]

2 голосов
/ 15 октября 2019

Начните с передачи соответствующих параметров для этого случая:

  1. sep = '[|,]' - есть два разделителя: a pipe char и запятая , поэтому определите их как регулярное выражение .
  2. skipinitialspace = True - ваш исходный текст содержит дополнительныепробелы (после разделителей), поэтому вы должны отбросить их.
  3. engine = 'python' - чтобы подавить предупреждение о Откат к движку 'python' .

Только указанные выше параметры позволяют без ошибок вызвать read_csv , но недостатком (на данный момент) является то, что остаются двойные кавычки.

Чтобы устранить их,по крайней мере из строк данных необходим еще один прием:

Определите функцию конвертера (лямбда-выражения):

cnv = lambda txt: txt.replace('"', '')

и примените ее ко всем исходным столбцам.

Inв вашем случае у вас есть 5 столбцов, поэтому для краткости кода вы можете использовать словарь :

{ i: cnv for i in range(5) }

Таким образом, весь код может быть:

df = pd.read_csv(io.StringIO(txt), sep='[|,]', skipinitialspace=True,
    engine='python', converters={ i: cnv for i in range(5) })

и результат:

  "column1"  "column2"       "column3"  "column4"  "column5"
0      123    sometext   this somedata   8 inches      hello

Но помните, что теперь все столбцы имеют тип string , поэтому вам необходимо преобразовать необходимые столбцы в числа. Альтернатива - передать второй преобразователь для числовых столбцов, возвращая число вместо строки.

Чтобы иметь правильные имена столбцов (без двойных кавычек), вы можете передать дополнительные параметры:

  • skiprows = 1 - чтобы пропустить начальную строку,
  • names = ["column1", "column2", "column3", "column4", "column5"] - определить список столбцов самостоятельно.
0 голосов
/ 15 октября 2019

Мы можем указать несколько сложный разделитель, прочитать данные и удалить лишние символы кавычек:

# Test data:
text='''"column1"| "column2"| "column3"| "column4"| "column5" 
        "123" | "sometext", "this somedata", "8 inches"", "hello"'''
ff=io.StringIO(text)


df= pd.read_csv(ff,sep=r'"\s*[|,]\s*"',engine="python")
# Make it tidy:
df= df.transform(lambda s: s.str.strip('"'))
df.columns= ["column1"]+list(df.columns[1:-1])+["column5"]

Результат:

  column1   column2        column3   column4 column5
0     123  sometext  this somedata  8 inches   hello
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...