You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python读取含空格分隔符与空格占位值的CSV文件问题

解决Advent of Code第5天的输入解析问题

你遇到的问题本质是这个输入不是标准CSV,而是固定宽度格式——每个货箱列占据固定的字符宽度,空格在这里是占位符而非分隔符,所以用read_csv自然搞不定。下面给两种可行的处理方式:

方法1:手动按位置提取(纯Python,无需pandas)

这个输入的规律是:每个货箱列对应的字符位置是1,5,9,...,33(每4个字符间隔一个列,对应9列),直接按这个位置提取即可:

# 读取文件内容
with open('input.txt', 'r') as f:
    lines = f.read().splitlines()

# 分离货箱堆和移动指令(根据你的输入调整行数)
stack_lines = lines[:8]  # 前8行是货箱堆
instructions = lines[10:]  # 跳过数字行,从第11行开始是指令

# 定义每个货箱列的字符索引位置
col_positions = [1 + 4*i for i in range(9)]  # 9列对应9个位置

# 初始化货箱堆:每个元素是一列,存储顺序从下到上
stacks = [[] for _ in range(9)]

# 从下往上遍历货箱行(因为输入第一行是堆的最上层)
for line in reversed(stack_lines):
    for idx, pos in enumerate(col_positions):
        crate_char = line[pos]
        if crate_char != ' ':
            stacks[idx].append(crate_char)

# 处理移动指令(以第一题的"逐个移动"为例)
import re
for instr in instructions:
    count, from_col, to_col = map(int, re.findall(r'\d+', instr))
    # 转换为0索引
    from_idx = from_col - 1
    to_idx = to_col - 1
    # 逐个移动
    for _ in range(count):
        stacks[to_idx].append(stacks[from_idx].pop())

# 获取最终结果:每个堆的最上层字符拼接
result = ''.join([stack[-1] for stack in stacks])
print(result)

方法2:用pandas的固定宽度读取

如果一定要用pandas,别用read_csv,用read_fwf(Fixed Width Format)直接按固定宽度解析:

import pandas as pd
import re

# 读取货箱堆部分,每列宽度为4,共9列
df = pd.read_fwf('input.txt', widths=[4]*9, nrows=8, header=None)

# 处理每一列:提取货箱字符,过滤空值,反转得到从下到上的顺序
stacks = []
for col in df.columns:
    # 用正则提取[]里的字符,去掉空值后反转
    stack_col = df[col].str.extract(r'\[(\w)\]', expand=False).dropna().tolist()[::-1]
    stacks.append(stack_col)

# 处理移动指令的逻辑和方法1一致
instructions = pd.read_csv('input.txt', skiprows=10, header=None)[0].tolist()
for instr in instructions:
    count, from_col, to_col = map(int, re.findall(r'\d+', instr))
    from_idx = from_col - 1
    to_idx = to_col - 1
    for _ in range(count):
        stacks[to_idx].append(stacks[from_idx].pop())

result = ''.join([stack[-1] for stack in stacks])
print(result)

关键说明

  • 输入里的货箱行是从上到下是堆的顶层到底层,所以必须反转每一列的顺序,才能得到栈的正确结构(栈是从下到上存储,pop取顶层)。
  • 移动指令里的数字是1-based索引,转换为代码里的0-based要减1。

内容的提问来源于stack exchange,提问作者Michael Lorenz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 05:05:41