Конвертировать файл ^I с разделителями в pandas dataframe
Я загружаю 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: теперь я использую вкладку в качестве разделителя, но получаю другую ошибку при чтении файла в dataframe. Возможно, это как-то связано с urlsafe_b64decode или data.encode('UTF-8'), но я не в состоянии понять. Фактический файл вложения в gmail - это файл, разделенный табуляцией.
UnicodeDecodeError: кодек "utf-8" не может декодировать байт 0xff в позиции 0: недопустимый начальный байт
1 ответ
Здесь есть две проблемы:
- разделитель столбцов
'^I'
- кодирование данных
Разделитель
'^I'
это еще один способ представления символа табуляции. Некоторые приложения могут представлять символы табуляции таким образом, а не использовать '\t'
escape-последовательность Например, 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')