Python无法读取在线dat文件,寻求列分隔解决方案
解决Python读取固定宽度dat文件的问题
我来帮你搞定这个读取dat文件的难题!你遇到的问题根源在于:这个文件是**固定宽度格式(Fixed-Width Format)**的,不是常规的空格/制表符分隔文本,所以你之前用分隔符拆分的方法都不管用~
为什么之前的方法失效?
pd.read_csv(url3, sep='\s+', ...):连续空格会被当成分隔符,但文件里的地区名称这类字段本身就包含空格,会被错误拆分;而且固定宽度的字段位置是严格固定的,靠空格分隔根本不适用。np.fromfile(url3):这个函数是用来读取二进制文件的,而你要读的是纯文本格式的数据集,完全不对路。pd.read_table(url3, header=None):默认用制表符作为分隔符,但这个文件里根本没有制表符,所以所有内容都被塞进了一列,自然没法拆分。
正确的解决方法:用pd.read_fwf读取固定宽度文件
固定宽度文件的每个字段都占据固定的字符长度,我们需要先明确每个字段的起始和结束位置,然后用pandas专门的read_fwf函数来读取。
步骤1:先查看文件的结构(可选但推荐)
先读取几行内容,确认字段的位置:
import requests url = 'https://www2.census.gov/programs-surveys/saipe/datasets/2002/2002-state-and-county/est02all.dat' response = requests.get(url) # 打印前5行,用repr能看到字符的准确位置 for line in response.text.splitlines()[:5]: print(repr(line))
步骤2:根据官方文档定义字段规则
SAIPE数据集的官方文档会给出每个字段的宽度和名称(比如2002年的这个文件,你可以查对应的数据集说明)。假设我们已经拿到了字段的位置和名称,就可以这样读取:
import pandas as pd url = 'https://www2.census.gov/programs-surveys/saipe/datasets/2002/2002-state-and-county/est02all.dat' # 定义每个字段的起始和结束索引(左闭右开) colspecs = [ (0, 2), # 州FIPS代码 (2, 5), # 县FIPS代码 (5, 45), # 地区名称(比如"Alabama, Autauga County") (45, 53), # 总人口估计数 (53, 61), # 贫困人口估计数 (61, 69), # 贫困率估计值 # 其他字段可以根据文档继续补充 ] # 对应字段的名称 col_names = [ 'state_fips', 'county_fips', 'area_name', 'total_population', 'poverty_population', 'poverty_rate', # 对应其他字段名称 ] # 读取文件,skiprows=1跳过第一行的标题行(如果你的文件第一行是标题的话) saipe02 = pd.read_fwf(url, colspecs=colspecs, names=col_names, skiprows=1) # 查看前几行验证结果 print(saipe02.head())
小提示:如果找不到官方文档
要是你找不到官方的字段说明,可以通过步骤1打印的内容手动数每个字段的宽度。比如看第一行的字符,从第0位到第2位是州代码,第2到第5位是县代码,以此类推,自己定义colspecs就行。
内容的提问来源于stack exchange,提问作者zilong
相关产品推荐
相关产品推荐

