如何在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




