使用Tabula-py提取PDF表格时,如何将Unicode转为UTF-8/ASCII字符串?
解决Tabula-py提取PDF表格返回Unicode格式数据的问题
问题场景
使用Tabula-py提取PDF表格时,工具可正确识别表格结构,但提取出的数据显示为Unicode编码格式(如\uXXXX形式),而非正常可读字符串。使用的代码如下:
from tabula import read_pdf df = read_pdf('https://watermark.silverchair.com/fsab153.pdf?token=AQECAHi208BE49Ooan9kkhW_Ercy7Dm3ZL_9Cf3qfKAc485ysgAAAs0wggLJBgkqhkiG9w0BBwagggK6MIICtgIBADCCAq8GCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMOXfntjWl9L87SyaXAgEQgIICgMSxXbyEzl4Y3sDeaGncgcE9V93d46LWUAnMiKz0KtHAKJA1HpPuefZZzrhJlD_hNUzK9C4uWwF1EfAbe0aWG3c_sFLetD5kqOWXzuGARvCRWOvmAEKpgtx0Desj5MY9lH7Zp7XxbfLBLScOIK6X_qEZ3Low6GkQfm1iBCbVHUg9ueKxLaYghX--uHPqmx43RZHk8bAjoDdMDT9lPsVXqlZJkmS2UT6T3uzC1jPTz3eON93C5CaEpW4lG_zvzMMltlZZm04Zz1vWd7WsXa_Gvc1gwO1AwUNcBxrRrr7Af5U02SPMaFF8dL0cOqrpw24LPzrg8ibtBq9yKidnCM-B2z74goz41kzv2KNZoPYQLj5XYlbyTknoE-MDo6cq_tGMw7igxbsrKUbGzSGILZ-bDQAVTyGKlU1QudNbZd4lDOe36kdr6dlhWHe7aK6vQgczTOYvQ0v1G5HwouxwTO0WPVpxawld76AZLhathmV4fMmNAYFpZDOytT4YAZEj-jjkPvzJ7HeA_-7ifmtwqLiOSILbLuJgEhLQ5frm9YXSn3crSInflJEsMm6Bs8pE_5H8vdex2tXzL6ZmHiDkDMdB_YM8iOhJGdMfZWsCJ0TcrtZyWZv5t-M1NzhLutplX-mYInE1sXZSTLHcOD0YDhEeMPNJhdGvISG_IbwDfH9OKuGQ0x8UCoe2DPVKOd53PYghKf2Bk8q7tILs3WeHgItnvRbkevjYS287gh_5052TKJJbC8dYxkVlHn-JCsbaMfn_SlYSaWjOfVxvSHKsVlFj5ry-cfScH8ai1bra8LASgwg4y_vpNeeDiA0CwZaPy2l_TF1O_yFsaKItyDkCMJXqhjI', pages=3)[0] df['Unnamed: 0']
(注:使用Debian系统,可解析这些Unicode编码,但需要转换为UTF-8或ASCII格式的可读数据)
解决方案
1. 批量转换DataFrame中的字符串
Python 3中默认字符串为Unicode类型,若显示为编码转义形式,可通过编码再解码的方式还原为正常字符串,可对整个DataFrame或指定列处理:
# 处理整个DataFrame的所有字符串列 df = df.applymap(lambda x: x.encode('utf-8').decode('utf-8') if isinstance(x, str) else x) # 仅处理指定列 df['Unnamed: 0'] = df['Unnamed: 0'].apply(lambda x: x.encode('utf-8').decode('utf-8') if isinstance(x, str) else x)
2. 读取PDF时指定编码参数
Tabula-py的read_pdf方法支持encoding参数,可直接指定UTF-8编码读取PDF,从源头避免编码问题:
df = read_pdf('your_pdf_path_or_url', pages=3, encoding='utf-8')[0]
3. 转换为ASCII格式(去除特殊Unicode字符)
若需要将数据转为纯ASCII格式,可使用unidecode库将特殊Unicode字符转换为近似的ASCII字符:
首先安装依赖库:
pip install unidecode
然后处理数据:
from unidecode import unidecode df['Unnamed: 0'] = df['Unnamed: 0'].apply(lambda x: unidecode(x) if isinstance(x, str) else x)
内容的提问来源于stack exchange,提问作者zoof
相关产品推荐
相关产品推荐

