You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Python3中以十六进制字符串作为分隔符逐行读取文件?

Python中实现类似Ruby的自定义分隔符逐行读取文件

嘿,这个需求很实用!Ruby的File.foreach确实提供了超便捷的自定义分隔符读取方式,在Python里我们虽然没有完全一模一样的内置函数,但可以通过两种主流方式实现等价效果,兼顾效率和易用性。

方法一:迭代式读取(适合大文件)

这种方式和Ruby的foreach逻辑最接近——逐块读取文件,不会一次性加载全部内容到内存,特别适合处理大文件。核心是利用Python文件对象的readline()方法(二进制模式下支持传入自定义分隔符),配合iter()函数构建迭代器:

# 定义十六进制分隔符,注意用字节串(对应Ruby的ASCII-8BIT模式)
separator = b'\x17\x05'

with open('input.dat', 'rb') as f:
    # iter()会重复调用lambda直到返回空字节串,实现按分隔符迭代读取
    for line in iter(lambda: f.readline(separator), b''):
        # 默认line会包含末尾的分隔符,如果需要去掉可以用line.rstrip(separator)
        print(line)
        # 如果需要转成字符串,可根据实际编码解码,比如ASCII:
        # print(line.decode('ascii'))

方法二:一次性读取后分割(适合小文件)

如果你的文件体积不大,一次性读取全部内容再分割会更简洁:

separator = b'\x17\x05'

with open('input.dat', 'rb') as f:
    content = f.read()
    # 按分隔符分割内容
    lines = content.split(separator)
    # 注意:如果文件结尾刚好是分隔符,split会生成一个空串,可通过lines[:-1]过滤
    for line in lines:
        print(line)

关键细节说明

  • Ruby的encoding: 'ASCII-8BIT'对应Python的二进制读取模式'rb',这样读取的内容是字节串,避免了编码自动转换的问题。如果需要处理字符串,记得用decode()方法指定对应编码。
  • 两种方法的区别:方法一内存占用低,适合大文件;方法二代码更简洁,但会把整个文件加载到内存,只适合小文件场景。

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

火山引擎 最新活动