如何从CSV文件中获取解析后数据及原始行内容?
读取CSV时同时获取解析后数据与原始行
在处理CSV文件时,有时需要同时保留解析后的结构化数据和原始CSV文本行(用于数据验证、审计等场景),以下是几种可行的实现方式:
方法一:基础场景(无换行字段)
如果CSV数据中没有包含换行符的字段,可直接遍历文件行并逐行解析,方式简单直观:
import csv # 打开CSV文件,newline=''避免不同系统换行符导致的解析错误 with open('some.csv', 'r', newline='') as f: for raw_line in f: # 可选:去除末尾换行符,按需保留原始格式 raw_line_clean = raw_line.rstrip('\n') # 解析当前行的CSV数据 parsed_row = next(csv.reader([raw_line])) # 输出解析结果与原始行 print(parsed_row) print(raw_line_clean)
方法二:通用场景(支持含换行的字段)
如果CSV字段中可能包含换行符(比如多行文本字段),上述方法会失效,可通过包装文件对象跟踪csv.reader读取的所有原始行:
import csv class FileWithRawBuffer: def __init__(self, file_obj): self.file = file_obj self.raw_buffer = [] def readline(self): # 读取一行并加入缓冲区 line = self.file.readline() if line: self.raw_buffer.append(line) return line def get_raw_content(self): # 获取当前解析行对应的所有原始文本,并清空缓冲区 raw_content = ''.join(self.raw_buffer).rstrip('\n') self.raw_buffer = [] return raw_content # 代理文件对象的其他方法 def __getattr__(self, attr): return getattr(self.file, attr) # 使用包装后的文件对象读取CSV with open('some.csv', 'r', newline='') as f: wrapped_file = FileWithRawBuffer(f) reader = csv.reader(wrapped_file) for parsed_row in reader: raw_content = wrapped_file.get_raw_content() print(parsed_row) print(raw_content)
代码说明
newline='':是csv模块推荐的打开方式,避免不同系统换行符导致的解析错误。- 包装类
FileWithRawBuffer:通过拦截readline()方法,记录csv.reader为解析一行所读取的所有原始文本,确保即使字段包含换行,也能完整获取对应原始内容。 - 可按需调整
rstrip('\n')的使用,如果需要保留原始行的换行符,直接使用''.join(self.raw_buffer)即可。
内容的提问来源于stack exchange,提问作者ZigZag
相关产品推荐
相关产品推荐

