如何用Python设置多字符行分隔符读取大CSV文件
在Python中处理大CSV文件的自定义多字符行分隔符
针对你提到的1TB大CSV文件,且需要用@#\n@#这种多字符字符串作为行分隔符的场景,Python内置文件对象默认不支持直接指定多字符行分隔符,不过可以通过逐块读取+缓冲区处理的方式实现和Perl中$/='@#\n@#'相同的效果,同时避免一次性加载超大文件到内存。
实现方案
写一个生成器函数,逐块读取文件内容,维护一个缓冲区来拼接内容,每次从缓冲区中分割出以目标分隔符结尾的片段,最后返回剩余内容:
def read_with_custom_delimiter(file_path, delimiter): buffer = "" # 按块读取,避免加载整个大文件 chunk_size = 4096 # 可根据磁盘IO性能调整,比如改为65536 with open(file_path, "r", encoding="utf-8") as f: while True: chunk = f.read(chunk_size) if not chunk: # 文件读取完毕,返回缓冲区剩余内容 if buffer: yield buffer break buffer += chunk # 循环分割缓冲区中的内容 while delimiter in buffer: split_idx = buffer.index(delimiter) # 返回分隔符之前的内容(对应Perl中的一行) yield buffer[:split_idx] # 更新缓冲区,保留分隔符之后的剩余内容 buffer = buffer[split_idx + len(delimiter):]
使用示例
调用这个函数遍历“行”内容,再处理CSV数据:
DELIMITER = "@#\n@#" for segment in read_with_custom_delimiter("a.csv", DELIMITER): # 解析CSV片段,比如按逗号分割 fields = segment.split(",") print(fields)
关键说明
- 内存友好:每次只读取固定大小的块,不会把1TB文件全部加载到内存,适合超大文件处理。
- 精准匹配:严格按照指定的多字符分隔符分割内容,和Perl的
$/行为完全一致。 - 编码兼容:打开文件时指定正确的编码(比如
utf-8),避免乱码问题。 - chunk_size调整:可以根据你的存储设备性能调整
chunk_size的值,更大的块可能提升读取效率,但不要超过系统内存承受范围。
内容的提问来源于stack exchange,提问作者user26195015
相关产品推荐
相关产品推荐

