如何用Pandas读取多行多列结构的CSV文件?
问题解答
能否用pandas.read_csv直接读取该格式文件?
不行。pandas.read_csv是基于单条记录对应单行的标准CSV格式设计的,对于这种一条记录的列信息分散在多行的非标准结构,没有内置参数可以直接处理,官方文档里也确实找不到对应的配置项。
推荐解决方案
核心思路是先将非标准CSV预处理为标准格式,再用pandas读取,以下是具体实现方案:
方案1:预处理文件生成标准CSV
先写简单脚本把每条记录的多行合并为一行,再读取。假设你的每条记录固定占N行(比如示例中每条是4行),可以用如下脚本:
# 读取原始文件,合并多行记录为单行 with open('原始数据.csv', 'r', encoding='utf-8') as in_f, open('标准格式.csv', 'w', encoding='utf-8') as out_f: all_lines = in_f.readlines() # 按每条记录的行数设置步长,比如每条占4行就设为4 record_line_count = 4 for idx in range(0, len(all_lines), record_line_count): # 提取当前记录的所有行,去掉换行符后用逗号拼接 record_segments = [line.strip() for line in all_lines[idx:idx+record_line_count]] out_f.write(','.join(record_segments) + '\n') # 现在可以正常用pandas读取 import pandas as pd df = pd.read_csv('标准格式.csv')
如果记录行数不固定,但用空行分隔每条记录,调整脚本逻辑:
with open('原始数据.csv', 'r', encoding='utf-8') as in_f, open('标准格式.csv', 'w', encoding='utf-8') as out_f: current_record = [] for line in in_f: stripped_line = line.strip() if stripped_line: current_record.append(stripped_line) else: if current_record: out_f.write(','.join(current_record) + '\n') current_record = [] # 处理文件末尾的最后一条记录 if current_record: out_f.write(','.join(current_record) + '\n')
方案2:直接读取并转换为DataFrame(无需中间文件)
用Python内置的csv模块逐行处理,直接生成DataFrame:
import pandas as pd import csv records = [] current_record = [] with open('原始数据.csv', 'r', encoding='utf-8') as f: csv_reader = csv.reader(f) for row in csv_reader: # 非空行属于当前记录,空行触发记录保存 if row: current_record.extend(row) else: if current_record: records.append(current_record) current_record = [] # 处理最后一条无空行结尾的记录 if current_record: records.append(current_record) # 手动指定表头(根据你的实际列名修改) df = pd.DataFrame(records, columns=['列名1', '列名2', '列名3', '列名4', ...])
注意事项
- 预处理前要先明确你的记录分隔规则:是固定行数,还是用特定字符/空行分隔,这是脚本逻辑的核心依据。
- 如果原始文件里有逗号等CSV特殊字符,建议用
csv.writer替代直接字符串拼接,避免格式错误。
内容的提问来源于stack exchange,提问作者Redgren Grumbholdt
相关产品推荐
相关产品推荐

