DiskReaderWriter.py 2.55 KB
Newer Older
liukaiwen's avatar
liukaiwen committed
1
import os
kernel.h@qq.com's avatar
kernel.h@qq.com committed
2
from magic_pdf.rw.AbsReaderWriter import AbsReaderWriter
liukaiwen's avatar
liukaiwen committed
3
from loguru import logger
liukaiwen's avatar
liukaiwen committed
4
5


liukaiwen's avatar
liukaiwen committed
6
class DiskReaderWriter(AbsReaderWriter):
许瑞's avatar
许瑞 committed
7
    def __init__(self, parent_path, encoding="utf-8"):
liukaiwen's avatar
liukaiwen committed
8
9
10
        self.path = parent_path
        self.encoding = encoding

icecraft's avatar
icecraft committed
11
    def read(self, path, mode=AbsReaderWriter.MODE_TXT):
liukaiwen's avatar
liukaiwen committed
12
13
14
15
16
        if os.path.isabs(path):
            abspath = path
        else:
            abspath = os.path.join(self.path, path)
        if not os.path.exists(abspath):
icecraft's avatar
icecraft committed
17
18
19
            logger.error(f"file {abspath} not exists")
            raise Exception(f"file {abspath} no exists")
        if mode == AbsReaderWriter.MODE_TXT:
许瑞's avatar
许瑞 committed
20
            with open(abspath, "r", encoding=self.encoding) as f:
liukaiwen's avatar
liukaiwen committed
21
                return f.read()
icecraft's avatar
icecraft committed
22
        elif mode == AbsReaderWriter.MODE_BIN:
许瑞's avatar
许瑞 committed
23
            with open(abspath, "rb") as f:
liukaiwen's avatar
liukaiwen committed
24
25
26
27
                return f.read()
        else:
            raise ValueError("Invalid mode. Use 'text' or 'binary'.")

icecraft's avatar
icecraft committed
28
    def write(self, content, path, mode=AbsReaderWriter.MODE_TXT):
liukaiwen's avatar
liukaiwen committed
29
30
31
32
        if os.path.isabs(path):
            abspath = path
        else:
            abspath = os.path.join(self.path, path)
liukaiwen's avatar
liukaiwen committed
33
34
        directory_path = os.path.dirname(abspath)
        if not os.path.exists(directory_path):
liukaiwen's avatar
liukaiwen committed
35
            os.makedirs(directory_path)
icecraft's avatar
icecraft committed
36
        if mode == AbsReaderWriter.MODE_TXT:
37
            with open(abspath, "w", encoding=self.encoding, errors="replace") as f:
liukaiwen's avatar
liukaiwen committed
38
                f.write(content)
liukaiwen's avatar
liukaiwen committed
39

icecraft's avatar
icecraft committed
40
        elif mode == AbsReaderWriter.MODE_BIN:
许瑞's avatar
许瑞 committed
41
            with open(abspath, "wb") as f:
liukaiwen's avatar
liukaiwen committed
42
                f.write(content)
liukaiwen's avatar
liukaiwen committed
43
44
45
        else:
            raise ValueError("Invalid mode. Use 'text' or 'binary'.")

icecraft's avatar
icecraft committed
46
47
48
49
50
51
52
    def read_offset(self, path: str, offset=0, limit=None):
        abspath = path
        if not os.path.isabs(path):
            abspath = os.path.join(self.path, path)
        with open(abspath, "rb") as f:
            f.seek(offset)
            return f.read(limit)
liukaiwen's avatar
liukaiwen committed
53

许瑞's avatar
许瑞 committed
54

liukaiwen's avatar
liukaiwen committed
55
if __name__ == "__main__":
icecraft's avatar
icecraft committed
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
    if 0:
        file_path = "io/test/example.txt"
        drw = DiskReaderWriter("D:\projects\papayfork\Magic-PDF\magic_pdf")

        # 写入内容到文件
        drw.write(b"Hello, World!", path="io/test/example.txt", mode="binary")

        # 从文件读取内容
        content = drw.read(path=file_path)
        if content:
            logger.info(f"从 {file_path} 读取的内容: {content}")
    if 1:
        drw = DiskReaderWriter("/opt/data/pdf/resources/test/io/")
        content_bin = drw.read_offset("1.txt")
        assert content_bin == b"ABCD!"
liukaiwen's avatar
liukaiwen committed
71

icecraft's avatar
icecraft committed
72
73
        content_bin = drw.read_offset("1.txt", offset=1, limit=2)
        assert content_bin == b"BC"
liukaiwen's avatar
liukaiwen committed
74