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
相关产品推荐
相关产品推荐

