如何使用pandas从指定txt网页提取数据并生成正确的DataFrame
pandas解析美国财政部公开统计TXT文件的调整方案
问题背景
- 目标数据源为公开的固定宽度排版统计文本《外国居民持有美国长期证券月度统计》,预期将其转换为结构规整的pandas DataFrame
- 前期尝试的两种代码方案均未成功:
- 按任意空格分隔的解析方案:
代码:
运行抛出import pandas as pd df = pd.read_table('https://ticdata.treasury.gov/Publish/slt1d.txt', skiprows=7, sep="\s*")ParserError,报错信息:Expected 33 fields in line 18, saw 39. Error could possibly be due to quotes being ignored when a multi-char delimiter is used - 无额外参数的默认解析方案:
代码:df = pd.read_table('https://ticdata.treasury.gov/Publish/slt1d.txt')
解析结果完全错位,仅输出无结构的零散文本片段,示例如下:TABLE 1D: U.S. Long-Term Securities Held by Foreign Residents in November 2020
0 ...
1 Total...
2 Long...
3 Secur...
4 ...
5 -----...
6 Europe
7 Albania ...
8 Armenia ...
9 Austria 2...
10 Azerbaijan 1...
11 Belarus ...
12 Belgium 92...
13 Bulgaria ...
14 Croatia ...
15 Cyprus ...
16 Czech Republic 2...
17 Denmark 18...
18 Estonia ...
19 Finland 5...
20 France 42...
- 按任意空格分隔的解析方案:
问题根因
该TXT文件为政府部门常用的固定列宽排版报表,并非按统一分隔符拆分的结构化文本。国家名称字段本身包含空格(如"Czech Republic"),使用sep="\s*"按任意空白拆分时,会将带空格的国家名拆分为多个独立字段,导致每行识别到的字段数和表头预设字段数不匹配,触发解析错误。使用默认参数解析时,程序未识别这种排版结构,自然输出错位的杂乱内容。
可运行的调整代码
import pandas as pd # 固定宽度解析模式,匹配报表的排版规则 df = pd.read_fwf( 'https://ticdata.treasury.gov/Publish/slt1d.txt', skiprows=7, # 跳过前7行非数据的标题、说明、分隔线内容 colspecs=[(0, 25), (26, 35), (36, 45), (46, 55), (56, 65), (66, 75)], # 匹配每列的实际字符起止位置 skipinitialspace=True ) # 清理无效空行 df = df.dropna(how='all') df = df[df.iloc[:, 0].str.strip() != '']
关键调整说明
- 替换
pd.read_table接口为专门处理固定宽度排版文本的pd.read_fwf,从根源上避免带空格的国家名被错误拆分 - 通过
colspecs参数指定每列的字符边界,精准对齐报表的排版位置,保证每行字段数一致 - 如果实际运行时发现列匹配错位,可先读取原始文本前20行预览,根据实际字符位置微调
colspecs参数的取值 - 跳过文件开头的非数据说明行,清理解析产生的无效空行,最终输出结构规整的DataFrame
内容的提问来源于stack exchange,提问作者Henrique Branco
相关产品推荐
相关产品推荐

