77import warnings
88from typing import Optional , Union
99
10- from PySide6 .QtCore import QFile , QIODevice
10+ from PySide6 .QtCore import QByteArray , QFile , QIODevice
1111
1212
1313class QtFileOpen :
@@ -91,29 +91,36 @@ def __init__(
9191 self ._file .open (self .mode )
9292
9393 @classmethod
94- def _parse_mode (cls , py_mode : str ) -> QIODevice :
94+ def _parse_mode (cls , py_mode : str ) -> QIODevice . OpenModeFlag :
9595 """
9696 解析文件打开模式,将 Python open() 风格转换至 QIODevice.OpenModeFlag
9797 https://docs.python.org/zh-cn/3/library/functions.html#open
9898 https://doc.qt.io/qt-6/qiodevicebase.html#OpenModeFlag-enum
9999 :return: mode
100100 """
101101
102- qt_mode : QIODevice = QIODevice .Text
102+ qt_mode : QIODevice . OpenModeFlag = QIODevice . OpenModeFlag .Text
103103
104104 # 暂不支持写入
105105 if "r" in py_mode and "+" not in py_mode :
106- qt_mode = qt_mode | QIODevice .ReadOnly
106+ qt_mode = qt_mode | QIODevice .OpenModeFlag . ReadOnly
107107 elif "w" in py_mode :
108- qt_mode = qt_mode | QIODevice .WriteOnly
108+ qt_mode = qt_mode | QIODevice .OpenModeFlag . WriteOnly
109109 elif "+" in py_mode :
110- qt_mode = qt_mode | QIODevice .ReadWrite
110+ qt_mode = qt_mode | QIODevice .OpenModeFlag . ReadWrite
111111
112112 if "x" in py_mode :
113- qt_mode = qt_mode | QIODevice .NewOnly
113+ qt_mode = qt_mode | QIODevice .OpenModeFlag . NewOnly
114114
115115 return qt_mode
116116
117+ @classmethod
118+ def qba_to_str (cls , qba : QByteArray , encoding : str = locale .getencoding ()) -> str :
119+ """
120+ 将 QByteArray 转换为 str
121+ """
122+ return qba .data ().decode (encoding = encoding )
123+
117124 def readable (self ) -> bool :
118125 """
119126 当前文件是否可读 \n
@@ -135,12 +142,13 @@ def read(self, size: int = -1) -> str:
135142
136143 if size < 0 or size is None :
137144 # 读取文件,并将 QByteArray 转为 str
138- text = str (self ._file .readAll (), encoding = self .encoding )
145+ text = self . qba_to_str (self ._file .readAll (), encoding = self .encoding )
139146 else :
140147 # 已知问题:性能太差
141148 # PySide6.QtCore.QIODevice.read(maxlen) 以字节而非字符方式计算长度,行为不一致
142149 # 而 QTextStream 对字符编码支持太差,许多编码并不支持
143- text = str (self ._file .readAll (), encoding = self .encoding )[0 :size ] # 性能太差
150+ text_all = self .qba_to_str (self ._file .readAll (), self .encoding )
151+ text = text_all [0 :size ] # 性能太差
144152
145153 return text
146154
@@ -166,7 +174,7 @@ def readline(self, size: int = -1, /) -> str:
166174 if size == 0 :
167175 return ""
168176 else :
169- line = str (self ._file .readLine (), encoding = self .encoding )
177+ line = self . qba_to_str (self ._file .readLine (), self .encoding )
170178 if size < 0 :
171179 return line
172180 else :
@@ -185,7 +193,7 @@ def readlines(self, hint: int = -1, /) -> list[str]:
185193 raise OSError (f"File '{ self ._file .fileName ()} ' is not Readable." )
186194
187195 if hint <= 0 or hint is None :
188- temp = str (self ._file .readAll (), encoding = self .encoding )
196+ temp = self . qba_to_str (self ._file .readAll (), self .encoding )
189197 all_lines = temp .splitlines (keepends = True )
190198 else :
191199 all_lines = []
0 commit comments