Python从PDF表格读取数值数据为字符串的解决方案求助
处理PDF提取的带千位空格的表格字符串
这个问题的核心是区分千位分隔符的空格和列之间的分隔空格,我们可以通过数值的特征(比如负数以-开头、正数的千位分隔空格后是纯数字)来做针对性的处理。这里给你一个实用的Python方案:
解决方案代码
def parse_pdf_table_line(line): tokens = line.split() if not tokens: return [] result = [tokens[0]] # 第一个元素是指标名称,比如"ebit" i = 1 total_columns = 8 # 你指定的每行总列数,减去指标列后需要处理7个数值列 # 循环处理剩余的tokens,直到凑够目标列数 while i < len(tokens) and len(result) < total_columns: current_token = tokens[i] # 处理负数:以"-"开头的,后面紧跟的是千位分隔的数字部分 if current_token.startswith('-'): # 合并当前负号开头的token和下一个数字token merged_num = current_token + tokens[i+1] result.append(merged_num) i += 2 # 处理带千位空格的正数:当前是数字,下一个也是数字(不是负号开头) elif i + 1 < len(tokens) and tokens[i+1].isdigit(): merged_num = current_token + tokens[i+1] result.append(merged_num) i += 2 # 处理单个数字(无千位分隔) else: result.append(current_token) i += 1 return result # 测试你的示例行 sample_line = "ebit 34 894 38 445 28 013 26 356 12 387 -8 680 -2 760 838" parsed_result = parse_pdf_table_line(sample_line) print(parsed_result) # 输出:['ebit', '34894', '38445', '28013', '26356', '12387', '-8680', '-2760'] # 注:如果你的示例行实际是9列,只需把total_columns改成9,就能包含最后的"838"
逻辑说明
- 拆分字符串:先把整行按空格拆分成token列表,方便逐个处理。
- 保留指标列:第一个token直接作为第一列(比如"ebit")。
- 区分空格类型:
- 遇到以
-开头的token,说明后面紧跟的是千位分隔的数字部分,直接合并两个token。 - 遇到纯数字token,且下一个token也是纯数字,说明是千位分隔的正数,合并两个token。
- 剩下的单个数字token直接作为单独列。
- 遇到以
- 控制列数:通过
total_columns参数确保最终结果符合你需要的列数。
扩展优化
如果你的PDF表格里还有其他格式的数值(比如带小数点的12 345.67),可以稍微修改合并逻辑,比如判断下一个token是否包含小数点,然后合并:
# 扩展处理带小数点的千位分隔数值 elif i + 1 < len(tokens) and (tokens[i+1].isdigit() or '.' in tokens[i+1]): merged_num = current_token + tokens[i+1] result.append(merged_num) i += 2
内容的提问来源于stack exchange,提问作者MarG
相关产品推荐
相关产品推荐

