如何用Python通过QDataStream读取文件中的QDateTime?
如何用Python读取QDataStream存储的QDateTime数据?
PyQt/PySide的QDataStream确实没有提供直接的readQDateTime()方法,你需要按照QDateTime在QDataStream中的序列化格式手动解析数据。
QDateTime的序列化规则(以Qt 5+版本为例):
- 首先读取一个
qint32类型的状态码,标记QDateTime是否有效、是否包含时区等信息 - 若状态码标记为有效,接着读取
qint64类型的毫秒级UTC时间戳(从1970-01-01 00:00:00开始计算) - 若状态码包含时区标记,还需读取对应的时区ID字符串
以下是完整的示例代码:
from PyQt5.QtCore import QFile, QDataStream, QDateTime, Qt infile = QFile(filepath) if not infile.open(QFile.ReadOnly): # 处理文件打开失败的逻辑,比如打印错误信息 print("无法打开文件") stream = QDataStream(infile) # 关键:设置和写入时一致的QDataStream版本,避免解析错误 # 示例:stream.setVersion(QDataStream.Qt_5_15) header = stream.readQString() version = stream.readInt() # 读取QDateTime数据 status = stream.readInt32() date = QDateTime() if status & 0x01: # 检查QDateTime是否有效 msecs_since_epoch = stream.readInt64() date.setMSecsSinceEpoch(msecs_since_epoch) if status & 0x02: # 检查是否包含时区信息 tz_id = stream.readQString() date.setTimeZone(Qt.TimeZone(tz_id.encode('utf-8')))
注意事项:
- 必须保证读取时的QDataStream版本与写入文件时的版本完全一致,否则会出现解析错误
- 如果写入的QDateTime是无效状态(未初始化),状态码的最低位为0,此时无需读取后续的时间戳和时区数据
- 若写入时未包含时区信息,可忽略时区解析部分,但要确保后续数据的读取位置正确
内容的提问来源于stack exchange,提问作者Juan
相关产品推荐
相关产品推荐

