python - 如何在 Python 中模拟以文本模式打开的文件
问题描述
我正在研究测试一些作用于文件的代码的方法,但我想编写一些仅依赖于源文件中的特定字符串而不是文件系统中某处的特定文件的测试。
我知道可以file
通过io.StringIO
.
问题是操作不遵循相同的语义。例如,根据文件对象是来自还是来自包含非 ASCII 字符的字符串,组合file.seek()
和会产生不同的结果:file.read()
open()
io.StringIO
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
显然,这是由于在打开文件的情况下参数.seek()
遵循bytes
语义,而它遵循语义。offset
open()
io.StringIO
str
我确实理解,出于性能原因,即使文件以文本模式打开也不具有seek()
以下语义是不切实际的。str
因此,我的问题是:如何使用遵循语义io.StringIO()
的方法获得等价物?我必须超越自己还是有更好的方法?seek
bytes
io.StringIO
解决方案
您可以使用BytesIO
andTextIOWrapper
来模拟真实文件的行为:
text = 'αβγδεζηθικλμνξoπρστυφχψω'
with io.BytesIO(text.encode('utf8')) as binary_file:
with io.TextIOWrapper(binary_file, encoding='utf8') as file_obj:
file_obj.seek(8)
print(file_obj.read(8))
# εζηθικλμ
推荐阅读
- node.js - 如何访问嵌套数据,这是猫鼬数组中的参考数据?
- angularjs - 如果有任何变化,AngularJS会同时重新加载多个选项卡
- ios - 如何在 iOS 中进行身份验证后显示谷歌帐户屏幕?
- flutter - 没有模拟器的颤振
- curl - curl: (7) 连接 127.0.0.1 端口 3000 失败:连接被拒绝
- sql - 通过调用函数更新列非常慢 - 如何改进?SQL 服务器
- python - 使用对象时面临“列表索引超出范围”错误
- c# - MailKit - SmtpClient Connect 方法冻结
- c# - Azure函数使用实体框架但连接字符串不起作用
- javascript - 为 ag-grid 定义仅一个特定列的自动大小列是可能的吗?