You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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)

关键说明

  1. 内存友好:每次只读取固定大小的块,不会把1TB文件全部加载到内存,适合超大文件处理。
  2. 精准匹配:严格按照指定的多字符分隔符分割内容,和Perl的$/行为完全一致。
  3. 编码兼容:打开文件时指定正确的编码(比如utf-8),避免乱码问题。
  4. chunk_size调整:可以根据你的存储设备性能调整chunk_size的值,更大的块可能提升读取效率,但不要超过系统内存承受范围。

内容的提问来源于stack exchange,提问作者user26195015

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 11:38:20