我正在研究一些用于测试处理文件的代码的方法,但我希望编写一些仅依赖源文件中特定字符串而不是在文件系统中具有特定文件的测试。
我知道可以通过io.StringIO
提供类似于file
的流接口来操作字符串。
问题是操作不遵循相同的语义。例如,使用file.seek()
和file.read()
的组合将根据文件对象是来自open()
还是来自io.StringIO
以及包含非ASCII字符的字符串而产生不同的结果:
import io
# 'abgdezhjiklmnxoprstufqyw'
text = 'αβγδεζηθικλμνξoπρστυφχψω'
with open('test.txt', 'w') as file_obj:
file_obj.write(text)
with open('test.txt', 'r') as file_obj:
file_obj.seek(8)
print(file_obj.read(8))
# εζηθικλμ
with io.StringIO(text) as file_obj:
file_obj.seek(8)
print(file_obj.read(8))
# ικλμνξoπ
对于仅包含ASCII字符的字符串,不存在此问题:
import io
text = 'abgdezhjiklmnxoprstufqyw'
with open('test.txt', 'w') as file_obj:
file_obj.write(text)
with open('test.txt', 'r') as file_obj:
file_obj.seek(8)
print(file_obj.read(8))
# iklmnxop
with io.StringIO(text) as file_obj:
file_obj.seek(8)
print(file_obj.read(8))
# iklmnxop
显然,这是由于在使用 open()
打开的文件中,.seek()
遵循了 bytes
语义的 offset
参数,而对于 io.StringIO
,它遵循了 str
语义。
我确实明白出于性能方面的考虑,即使以文本模式打开文件,也不实用按照 str
语义来进行 seek()
。
因此,我的问题是:如何获得一个等效的 io.StringIO()
,并且具有按照 bytes
语义进行 seek
的方法?我需要自己覆盖 io.StringIO
吗,还是有更好的方法?
seek(8)
会导致未定义的行为。请参阅 https://docs.python.org/3/library/io.html#io.TextIOBase.seek 所以你真的不应该这样做。 - PM 2Ring/tmp/
目录。不需要寻找复杂的解决方案。 - Alexandr Zayets