【问题标题】:Convert ^I delimited file to pandas dataframe将 ^I 分隔文件转换为 pandas 数据框
【发布时间】:2019-09-29 19:55:03
【问题描述】:

我正在使用以下代码从 gmail 附件下载 csv 文件。生成的输出文件看起来像 ^I delimited,我不确定如何将其更改为其他分隔符,以便可以将其加载到 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' 编解码器无法在位置解码字节 0xff 0:无效的起始字节

【问题讨论】:

  • 实际的列名是 Location ID、Processed Currency Code、External MID、DBA Name
  • 您可以在使用 pandas 读取 csv 时指定分隔符:pd.read_csv(filename, sep='^|')
  • ^I 是另一种表示制表符的方式,因此这很可能是制表符分隔的文件。有关如何加载,请参阅欺骗目标。
  • @Erfan - 我试过了,但它无法在文件中找到 ^I 并将所有内容放在一个列中

标签: python pandas base64 gmail-api base64url


【解决方案1】:

这里有两个问题:

  • 列分隔符'^I'
  • 数据的编码

分隔符

'^I' 是表示tab character 的另一种方式。某些应用程序可能会选择以这种方式表示制表符而不是使用'\t' 转义序列。例如,vim 在指示显示非打印字符时将选项卡显示为'^I'

编码

'0xff'byte-order-mark 或 BOM 的一部分 - 一个不可见的字符序列,用于告诉应用程序有关用于编码文本的编码。 UTF-16 编码使用序列'0xfe0xff' 来表示大端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')

【讨论】:

    猜你喜欢
    • 2019-09-25
    • 2020-02-29
    • 2022-01-10
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 2020-04-03
    • 2021-05-26
    相关资源
    最近更新 更多