
当从文本文件读取数据并先存入字符串列表、再构建 DataFrame 时,若直接将每行作为单个元素传入 pd.DataFrame(),会导致所有字段被压缩进一列;需在构造前按空格分割每行,或使用 str.split(expand=True) 实现列分离。
当从文本文件读取数据并先存入字符串列表、再构建 dataframe 时,若直接将每行作为单个元素传入 `pd.dataframe()`,会导致所有字段被压缩进一列;需在构造前按空格分割每行,或使用 `str.split(expand=true)` 实现列分离。
在实际数据处理中,常遇到格式不规整的固定宽度或空格分隔文本(如日志、遗留系统导出),无法直接用 pd.read_csv 的标准参数解析。此时,若必须通过“先读为字符串列表、再转 DataFrame”的流程,则关键在于确保每一行被正确拆分为多个字段,而非整体作为单个字符串。
✅ 正确做法一:在构建列表时即完成分割
import pandas as pd
data_list = []
with open('input.txt', 'r') as f:
for line in f:
# strip() 去首尾空白,split() 按任意空白符(空格/制表符)分割,并自动忽略连续空格
fields = line.strip().split()
data_list.append(fields)
# 构造 DataFrame,并指定列名(可选)
df = pd.DataFrame(data_list, columns=['a', 'b', 'c', 'd'])
print(df.shape) # (4, 4)
print(df)?
str.split()默认以任意空白字符为分隔符,且自动跳过空字段(如多空格间无内容),非常适合处理此类松散对齐的文本。
✅ 正确做法二:先构建 Series,再用 str.split(expand=True)
with open('input.txt', 'r') as f:
data_list = [line.strip() for line in f]
# 转为 Series 后调用向量化字符串方法
df = pd.Series(data_list).str.split(expand=True)
df.columns = ['a', 'b', 'c', 'd'] # 可选:重命名列该方法优势在于无需手动循环分割,且 expand=True 确保返回 DataFrame(而非嵌套 list);即使某行字段数不一致,也能自动填充 NaN,提升鲁棒性(但需后续校验)。
⚠️ 注意事项
- 避免使用
line.split(' ')(显式指定空格)——它会把连续空格视为多个分隔符,产生空字符串字段; - 若字段含内嵌空格(如
"John Doe"),上述方法将失效,此时应改用pd.read_fwf()或正则str.extract(); - 原始示例中
040525开头的0被保留,若需数值型去前导零,可在构建后执行:df['a'] = df['a'].astype(int); - 大文件场景下,推荐做法一(内存友好),做法二适合小到中等规模数据(依赖 Pandas 向量化优化)。
最终,DataFrame 将正确呈现为 4 行 × 4 列结构,列名清晰、字段独立,为后续清洗与分析奠定基础。

















