gpt4 book ai didi

python - 将 Python 2.x 文件(如对象)移植到 Python 3

转载 作者:太空宇宙 更新时间:2023-11-03 19:02:47 33 4
gpt4 key购买 nike

我正在努力改进 Python 3.X 对 PyFilesystem 的支持。它是文件系统的抽象。每个文件系统对象都有一个 open 方法,该方法返回一个类似文件的对象。

我面临的问题是 open 方法在 Python 2.X 上工作 open ,但我希望它像 io.open 一样工作,它返回一个许多二进制或文本模式流。

我可以使用的是一种获取 Python 2.X 文件类对象,并返回一个适当的 io 流对象的方法,该对象读取/写入底层文件类对象(但如果需要,可以处理缓冲/unicode 等) )。

我在想如下内容:

def make_stream(file_object, mode, buffering, encoding):
# return a io instance

我看不到使用 stdlib 执行此操作的任何直接方法。但它让我觉得 io 模块必须在幕后做一些事情,因为它是一个提供缓冲/unicode 功能的软件层。

最佳答案

Python 2 包含相同的 io library也是。

使用 from io import open 在 Python 版本之间进行相同的操作。

然后,您的 API 应提供使用 open() 等效项(称为 open()make_stream()) io 类库提供相同的功能。

您需要做的就是创建一个实现 io.RawIOBase ABC 的类。 ,然后使用库提供的其他类来添加缓冲和文本处理根据需要:

import io

class MyFileObjectWrapper(io.RawIOBase):
def __init__(self, *args):
# do what needs done

def close(self):
if not self.closed:
# close the underlying file
self.closed = True

# ... etc for what is needed (e.g. def read(self, maxbytes=None), etc.

def open(fileobj, mode='r', buffering=-1, encoding=None, errors=None, newline=None):
# Mode parsing and validation adapted from the io/_iomodule.c module
reading, writing, appending, updating = False
text, binary, universal = False

for c in mode:
if c == 'r':
reading = True;
continue
if c == 'w':
writing = True;
continue
if c == 'a':
appending = True;
continue
if c == '+':
updating = True;
continue
if c == 't':
text = True;
continue
if c == 'b':
binary = True;
continue
if c == 'U':
universal = reading = True;
continue
raise ValueError('invalid mode: {!r}'.format(mode))

rawmode = []
if reading: rawmode.append('r')
if writing: rawmode.append('w')
if appending: rawmode.append('a')
if updating: rawmode.append('+')
rawmode = ''.join(rawmode)

if universal and (writing or appending):
raise ValueError("can't use U and writing mode at once")

if text and binary) {
raise ValueError("can't have text and binary mode at once")

if reading + writing + appending > 1:
raise ValueError("must have exactly one of read/write/append mode")

if binary
if encoding is not None:
raise ValueError("binary mode doesn't take an encoding argument")
if errors is not None:
raise ValueError("binary mode doesn't take an errors argument")
if newline is not None:
raise ValueError("binary mode doesn't take a newline argument")

raw = MyFileObjectWrapper(fileobj)

if buffering == 1:
buffering = -1
line_buffering = True
else:
line_buffering = False

if buffering < 0:
buffering = SOME_SUITABLE_DEFAULT

if not buffering
if not binary:
raise ValueError("can't have unbuffered text I/O")

return raw

if updating:
buffered_class = io.BufferedRandom
elif writing or appending:
buffered_class = io.BufferedWriter
elif reading:
buffered_class = io.BufferedReader

buffer = buffered_class(raw, buffering)

if binary:
return buffer

return io.TextIOWrapper(buffer, encoding, errors, newline, line_buffering)

以上代码大部分改编自Modules/_io/_iomodule.c io_open function ,但原始文件对象被 io.RawIOBase ABC 的 MyFileObjectWrapper 子类替换。

关于python - 将 Python 2.x 文件(如对象)移植到 Python 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15613106/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com