使用Pandas读取.txt文件时仅返回NaNs的问题求助
解决Pandas读取TXT文件返回全NaN的问题
根据你提供的文件内容,这是**固定宽度格式(Fixed-Width)**的文本,并非制表符或单一空格分隔的CSV,因此sep="\t"无法正确识别列,导致返回全NaN。以下是几种可行的解决方法:
方法1:用pd.read_fwf()读取固定宽度文件
这是适配这类文件的最优方案,Pandas专门提供了读取固定宽度格式的函数:
import pandas as pd # Pandas会自动推断列宽,直接读取 df = pd.read_fwf('s3://filepath', encoding='latin-1')
如果自动推断列宽不准确,可手动指定每列的起始/结束位置(根据实际文本的字符位置调整):
# 示例列位置定义,需根据你的文件实际列宽修改 colspecs = [(0, 9), (10, 19), (20, 22), (23, 68), (69, 76), (77, 83), (84, 95), (96, 107), (108, 113), (114, 119), (120, 121)] df = pd.read_fwf('s3://filepath', encoding='latin-1', colspecs=colspecs)
方法2:用正则表达式匹配任意数量空格作为分隔符
若不想用read_fwf,可在read_csv中设置分隔符为任意数量的空白字符:
import pandas as pd df = pd.read_csv('s3://filepath', encoding='latin-1', sep=r'\s+')
注意:如果某列内容本身包含空格(比如示例中的Vacant Land Agricultural/Horticultural/Forest Vacant Land),此方法会将该列拆分为多列,这种场景下优先选择read_fwf。
方法3:手动清洗文本后再读取
如果上述方法仍有问题,可先读取文本并统一分隔符,再转为DataFrame:
import pandas as pd from io import StringIO # 读取文件内容 with open('s3://filepath', 'r', encoding='latin-1') as f: lines = f.readlines() # 将连续多空格替换为单个制表符,清洗文本 cleaned_lines = [] for line in lines: # 先把多空格替换成单个制表符,再去除首尾空白 cleaned_line = ' '.join(line.split()).replace(' ', '\t').strip() cleaned_lines.append(cleaned_line) # 转为DataFrame df = pd.read_csv(StringIO('\n'.join(cleaned_lines)), sep='\t')
内容的提问来源于stack exchange,提问作者kms
相关产品推荐
相关产品推荐

