如何检测StringIO文件所使用的行尾符?
解决StringIO检测行尾符返回None的问题
真实文件对象在文本模式下调用readline()后,会自动将实际遇到的行尾符记录到newlines属性里,但StringIO(包括io.StringIO)并没有实现这个属性,所以你测试时会得到None。
给你两个可行的解决办法:
方法一:兼容StringIO的行尾符检测函数
修改getLineEnding,让它既能处理真实文件,也能处理内存流:
def getLineEnding(filehandle): line = filehandle.readline() # 优先用真实文件的newlines属性 if hasattr(filehandle, 'newlines') and filehandle.newlines is not None: return filehandle.newlines # 手动解析行尾符 if line.endswith('\r\n'): return '\r\n' elif line.endswith('\n'): return '\n' elif line.endswith('\r'): return '\r' # 无行尾符时返回默认值,可按需调整 return '\r\n'
测试代码:
from io import StringIO f = StringIO() f.write('test\r\n') f.seek(0) print(getLineEnding(f)) # 输出 \r\n
方法二:用临时文件模拟真实场景
如果只是为了测试,不想修改检测函数,可以用tempfile创建临时文件,模拟真实文件的行为:
import tempfile def getLineEnding(filehandle): filehandle.readline() return filehandle.newlines # 创建临时文件测试 with tempfile.NamedTemporaryFile(mode='w', delete=False) as tmp_f: tmp_f.write('test\r\n') with open(tmp_f.name, 'r') as f: print(getLineEnding(f)) # 输出 \r\n
这样不管是真实文件还是测试场景,都能正确检测到原文件的行尾符,满足你保留原文件行尾格式的需求。
内容的提问来源于stack exchange,提问作者klutt
相关产品推荐
相关产品推荐

