Конвертировать файл ^ I с разделителями в pandas dataframe - PullRequest
0 голосов
/ 12 мая 2019

Я загружаю файл csv из вложения gmail, используя приведенный ниже код. Сгенерированный выходной файл выглядит как ^ Я разграничил, и я не уверен, как изменить его на какой-либо другой разделитель, чтобы я мог загрузить его в кадр данных pandas.

message = service.users().messages().get(userId=user_id, id=msg_id).execute()
for part in message['payload'].get('parts', ''):
    if part['filename']:
        file_name = part['filename']
        att_id = part['body']['attachmentId']
        att = service.users().messages().attachments().get(userId=user_id, messageId=msg_id,
                                                               id=att_id).execute()
        data = att['data']
file_data = base64.urlsafe_b64decode(data.encode('UTF-8'))
with open(path, 'wb') as f:
    f.write(file_data)

Содержимое выходного файла разделено, как показано ниже - ID местоположения ^ IP-код обработанной валюты ^ IExternal MID ^ Имя IDBA

Редактировать 1: Теперь я использую tab как разделитель, но получаю другую ошибку при чтении файла в dataframe. Возможно, это как-то связано с urlsafe_b64decode или data.encode ('UTF-8'), но я не в состоянии понять. Фактический файл вложения в gmail - это файл, разделенный табуляцией.

UnicodeDecodeError: кодек «utf-8» не может декодировать байт 0xff в позиции 0: неверный начальный байт

1 Ответ

2 голосов
/ 12 мая 2019

Здесь есть два вопроса:

  • разделитель столбцов '^I'
  • кодировка данных

Разделитель

'^I' - это еще один способ представления символа табуляции . Некоторые приложения могут представлять символы табуляции таким образом, вместо использования escape-последовательности '\t'. Например, vim отображает вкладки как '^I', когда им указывается отображать непечатаемые символы.

Кодирование

'0xff' является частью метки порядка байтов или BOM - невидимой последовательности символов, используемой, чтобы сообщать приложениям о кодировке, используемой для кодирования текста. Кодировка UTF-16 использует последовательность '0xfe0xff' для обозначения UTF-16 с прямым порядком байтов (кодек Python 'utf-16-be'). '0xff0xfe' обозначает UTF-16 с прямым порядком байтов (кодек Python 'utf-16-le'). UTf-16 использует два байта для кодирования символов, поэтому важен порядок байтов.

Итак, чтобы успешно открыть вложение, необходимо указать, что разделитель столбцов является вкладкой, а кодировка - UTF-16 (Python может использовать спецификацию, чтобы определить, какая версия UTF-16):

pd.read_csv(path, header=0, sep='\t', encoding='utf-16')
...