Update open_qfile.py

更新 `QtFileOpen` 与 `PyQTextFileIo`:
增强处理(抛出)异常的能力;
完善文档与类型注解等;
This commit is contained in:
muzing 2023-12-26 23:02:36 +08:00 committed by 木子
parent 343af9ab7c
commit e5651cc0c2

View File

@ -7,7 +7,7 @@ import pathlib
import warnings import warnings
from typing import Optional, Union from typing import Optional, Union
from PySide6.QtCore import QByteArray, QFile, QIODevice from PySide6.QtCore import QByteArray, QFile, QFileInfo, QIODevice
class QtFileOpen: class QtFileOpen:
@ -30,7 +30,7 @@ class QtFileOpen:
""" """
:param file: 文件路径 :param file: 文件路径
:param mode: 打开模式暂时只支持文本读取 :param mode: 打开模式暂时只支持文本读取
:param encoding: 文本文件编码 :param encoding: 文本文件编码留空则自动处理
""" """
# 预处理文件路径,防止在 Windows 平台下 QFile 只能处理 '/' 导致的问题 # 预处理文件路径,防止在 Windows 平台下 QFile 只能处理 '/' 导致的问题
@ -62,7 +62,7 @@ class QtFileOpen:
# 若路径以字节串传入,则先处理成字符串 # 若路径以字节串传入,则先处理成字符串
if isinstance(path, bytes): if isinstance(path, bytes):
path = str(path, encoding="utf-8") path = path.decode("utf-8")
return str(pathlib.PurePath(path).as_posix()) return str(pathlib.PurePath(path).as_posix())
@ -73,12 +73,14 @@ class PyQTextFileIo:
目前只支持读取不支持写入 目前只支持读取不支持写入
""" """
def __init__( def __init__(self, file: str, mode, encoding: Optional[str] = None):
self, """
file: Union[str, bytes, os.PathLike[str]], :param file: 文件路径
mode, :param mode: 打开模式
encoding: Optional[str] = None, :param encoding: 文本编码
): """
self._detect_error(file)
self._file = QFile(file) self._file = QFile(file)
if encoding is not None: if encoding is not None:
@ -90,6 +92,19 @@ class PyQTextFileIo:
self.mode = self._parse_mode(mode) self.mode = self._parse_mode(mode)
self._file.open(self.mode) self._file.open(self.mode)
@staticmethod
def _detect_error(input_file: str) -> None:
"""
检查传入的文件是否存在错误如有则抛出对应的异常 \n
:param input_file: 文件路径
"""
file_info = QFileInfo(input_file)
if file_info.isDir():
raise IsADirectoryError(f"File '{input_file}' is a directory.")
if not file_info.exists():
raise FileNotFoundError(f'File "{input_file}" not found.')
@classmethod @classmethod
def _parse_mode(cls, py_mode: str) -> QIODevice.OpenModeFlag: def _parse_mode(cls, py_mode: str) -> QIODevice.OpenModeFlag:
""" """
@ -138,7 +153,7 @@ class PyQTextFileIo:
""" """
if not self.readable(): if not self.readable():
raise OSError(f"File '{self._file.fileName()}' is not Readable.") raise PermissionError(f"File '{self._file.fileName()}' is not Readable.")
if size < 0 or size is None: if size < 0 or size is None:
# 读取文件,并将 QByteArray 转为 str # 读取文件,并将 QByteArray 转为 str
@ -161,7 +176,7 @@ class PyQTextFileIo:
""" """
if not self.readable(): if not self.readable():
raise OSError(f"File '{self._file.fileName()}' is not Readable.") raise PermissionError(f"File '{self._file.fileName()}' is not Readable.")
if self._file.atEnd(): if self._file.atEnd():
warnings.warn( warnings.warn(
@ -190,7 +205,7 @@ class PyQTextFileIo:
""" """
if not self.readable(): if not self.readable():
raise OSError(f"File '{self._file.fileName()}' is not Readable.") raise PermissionError(f"File '{self._file.fileName()}' is not Readable.")
if hint <= 0 or hint is None: if hint <= 0 or hint is None:
temp = self.qba_to_str(self._file.readAll(), self.encoding) temp = self.qba_to_str(self._file.readAll(), self.encoding)