.read_csv () в пандах неправильно читает escape-символы - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь создать конвейер ETL с пандами и CSVing данными, но у меня возникают некоторые проблемы с некоторыми управляющими символами.

Если, например, мои данные '\ "' иопределен escape-символ '\' с кавычкой '"', когда я читаю файл, мои данные превращаются в" \ ", пропуская один escape-символ.

import sys
if sys.version_info[0] < 3: 
    from StringIO import StringIO
else:
    from io import StringIO

import pandas as pd
import csv

escape_char_defined = '\\'
quote_defined = '"'
separator = "|"

sample_data = []

for i in range(1,11):
    sample_data.append(i*escape_char_defined + quote_defined)

initial_df = pd.DataFrame(sample_data,columns=['column'])


csv_text = initial_df.to_csv(sep=separator,columns=None,header=None,index=False,doublequote=False,quoting=csv.QUOTE_ALL,quotechar=quote_defined,escapechar=escape_char_defined,encoding='utf-8')

csv_text = StringIO(csv_text)

final_df = pd.read_csv(csv_text,sep=separator,escapechar=escape_char_defined,quoting=csv.QUOTE_ALL,header=None,doublequote=False,encoding='utf-8')

if not final_df.equals(initial_df):
    raise Exception("Dataframes are not equal!")    

Я не думаю, что это ожидаемое поведение, так как яиспользую те же инструменты для написания и чтения текста CSV.

У кого-нибудь уже есть проблемы с этим?

1 Ответ

0 голосов
/ 28 февраля 2019

Вот фиксированный код, если я правильно понял, что вам нужно.

import sys
if sys.version_info[0] < 3: 
    from StringIO import StringIO
else:
    from io import StringIO

import pandas as pd
import csv

escape_char_defined = "\\"
quote_defined = '"'
separator = "|"

sample_data = []

for i in range(1,11):
    sample_data.append(i*escape_char_defined + quote_defined)

initial_df = pd.DataFrame(sample_data,columns=['column'])

csv_text = initial_df.to_csv(sep=separator,columns=None,quoting=csv.QUOTE_NONE,header=None,index=False,doublequote=False,quotechar=quote_defined,escapechar=escape_char_defined)
csv_text = StringIO(csv_text)
final_df = pd.read_csv(csv_text,names=(["column"]),sep=separator,quoting=csv.QUOTE_NONE,escapechar=escape_char_defined,quotechar=quote_defined,header=None,doublequote=False)

if not final_df.equals(initial_df):
    raise Exception("Dataframes are not equal!")    

Я заменил quoting=csv.QUOTE_ALL в pd.to_csv() и pd.read_csv() на quoting=csv.QUOTE_NONE.

Опция csv.QUOTE_NONE блокирует писателя для цитирования полей.Если в выходных данных присутствует текущий разделитель, ему предшествует текущий escape-символ.Если он не установлен, средство записи выдаст ошибку, если встретятся какие-либо символы, требующие экранирования.

В pd.read_csv () я также добавил имя столбца как 'column'

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