将 ^I 分隔文件转换为 pandas 数据帧
Convert ^I delimited file to pandas dataframe
我正在使用以下代码从 gmail 附件下载一个 csv 文件。生成的输出文件看起来像 ^I 分隔符,我不确定如何将它更改为其他分隔符,以便我可以将它加载到 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^I处理货币代码^I外部 MID^IDBA 名称
编辑 1:
现在我使用制表符作为分隔符,但在将文件读入数据帧时出现不同的错误。也许,它与 urlsafe_b64decode 或 data.encode('UTF-8') 有关,但我无法理解。 gmail 中的实际附件文件是制表符分隔文件。
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position
0: invalid start byte
这里有两个问题:
- 列分隔符
'^I'
- 数据编码
分隔符
'^I'
是 tab character 的另一种表示方式。某些应用程序可能选择以这种方式表示制表符而不是使用 '\t'
转义序列。例如 vim 在指示显示 non-printing 个字符时将制表符显示为 '^I'
。
编码
'0xff'
是 byte-order-mark 或 BOM 的一部分 - 一种不可见的字符序列,用于告知应用程序有关用于编码文本的编码。 UTF-16 编码使用序列 '0xfe0xff'
表示 big-endian UTF-16(Python 编解码器 'utf-16-be')。 '0xff0xfe'
表示 little-endian UTF-16(Python 编解码器 'utf-16-le')。 UTf-16 使用两个字节来编码字符,因此字节的顺序很重要。
所以,要成功打开附件,需要指定列分隔符是制表符,编码是UTF-16(Python可以根据BOM算出是哪个版本的UTF- 16):
pd.read_csv(path, header=0, sep='\t', encoding='utf-16')
我正在使用以下代码从 gmail 附件下载一个 csv 文件。生成的输出文件看起来像 ^I 分隔符,我不确定如何将它更改为其他分隔符,以便我可以将它加载到 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^I处理货币代码^I外部 MID^IDBA 名称
编辑 1: 现在我使用制表符作为分隔符,但在将文件读入数据帧时出现不同的错误。也许,它与 urlsafe_b64decode 或 data.encode('UTF-8') 有关,但我无法理解。 gmail 中的实际附件文件是制表符分隔文件。
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
这里有两个问题:
- 列分隔符
'^I'
- 数据编码
分隔符
'^I'
是 tab character 的另一种表示方式。某些应用程序可能选择以这种方式表示制表符而不是使用 '\t'
转义序列。例如 vim 在指示显示 non-printing 个字符时将制表符显示为 '^I'
。
编码
'0xff'
是 byte-order-mark 或 BOM 的一部分 - 一种不可见的字符序列,用于告知应用程序有关用于编码文本的编码。 UTF-16 编码使用序列 '0xfe0xff'
表示 big-endian UTF-16(Python 编解码器 'utf-16-be')。 '0xff0xfe'
表示 little-endian UTF-16(Python 编解码器 'utf-16-le')。 UTf-16 使用两个字节来编码字符,因此字节的顺序很重要。
所以,要成功打开附件,需要指定列分隔符是制表符,编码是UTF-16(Python可以根据BOM算出是哪个版本的UTF- 16):
pd.read_csv(path, header=0, sep='\t', encoding='utf-16')