如何在Python中读取含多行值的Informix UNL文件为DataFrame或CSV
如何在Python中读取含多行值的Informix UNL文件为DataFrame或CSV
我之前也踩过Informix导出的这种UNL文件的坑——它用反斜杠转义单元格内的逗号和换行,但pandas的read_csv默认逻辑对这种转义换行支持不太友好,因为它的escapechar参数只作用于分隔符和引号,不会自动处理被转义的行终止符。下面给你两个简单可行的解决方案:
方案一:预处理文件后用pandas读取
核心思路是先还原单元格内的换行,再交给pandas解析转义的逗号:
import pandas as pd import csv from io import StringIO def process_informix_unl(file_path): # 读取整个文件内容 with open(file_path, 'r', encoding='utf-8') as f: content = f.read() # 把Informix的转义换行(\ + 换行)还原成真实的单元格内换行 processed_content = content.replace('\\\n', '\n') # 用pandas解析处理后的内容 df = pd.read_csv( StringIO(processed_content), sep=',', escapechar='\\', quoting=csv.QUOTE_NONE ) return df # 调用示例 df = process_informix_unl('1.unl') print(df) # 如需保存为标准CSV(自动给含特殊字符的单元格加引号) df.to_csv('output.csv', quotechar='"', quoting=csv.QUOTE_NONNUMERIC, index=False)
这个方案逻辑很直接:Informix用\+换行表示单元格内的换行,我们先把这种组合还原成真实换行符,再通过escapechar='\\'让pandas把\,解析成普通逗号,完美匹配原数据的转义规则。
方案二:手动逐行解析(适合复杂场景)
如果预处理后仍有边缘问题,你可以手动处理转义和行合并逻辑,精细控制每一步:
import pandas as pd def parse_informix_unl(file_path): headers = None data_rows = [] current_field = [] with open(file_path, 'r', encoding='utf-8') as f: for line in f: stripped_line = line.rstrip('\n') # 行尾是反斜杠,说明是当前单元格的延续 if stripped_line.endswith('\\'): current_field.append(stripped_line[:-1]) else: current_field.append(stripped_line) full_field_str = ''.join(current_field) # 拆分字段:处理转义的逗号 fields = [] temp_field = [] is_escaped = False for char in full_field_str: if is_escaped: temp_field.append(char) is_escaped = False elif char == '\\': is_escaped = True elif char == ',': fields.append(''.join(temp_field)) temp_field = [] else: temp_field.append(char) fields.append(''.join(temp_field)) if not headers: headers = fields else: data_rows.append(fields) # 重置当前字段缓存 current_field = [] return pd.DataFrame(data_rows, columns=headers) # 调用示例 df = parse_informix_unl('1.unl') print(df)
为什么你的原代码没生效?
你之前加了lineterminator='\n'参数,这会强制pandas把所有换行都当成行终止符,完全忽略前面的转义反斜杠。去掉这个参数,再配合预处理步骤,就能正确识别行边界了。
备注:内容来源于stack exchange,提问作者Azhak Anwar
相关产品推荐
相关产品推荐

