如何使用特定的字符作为换行符而不是\n来读取ZIpFile?

How to read a ZIpFile using a specific char as newline separator, instead of \n?

提问人:kiks73 提问时间:7/6/2023 更新时间:7/6/2023 访问量:22

问:

我有这个代码:

from zipfile import ZipFile
...
with ZipFile(flu) as zf:
    for file in zf.namelist():
        if not file.endswith('.sql'):
            continue
        with zf.open(file,"r") as f:
            ...
        for row_b in f:
            ...

我想在打开 zip 文件时使用 char ';“ 作为换行符,而不是 '\n'。这样,如果 zip 文件中包含的 SQL 语句格式为多行,我也可以运行它们。

我找到了这个文档和这个文档,似乎我可以在打开流时指定换行符分隔符。 打开zip文件时,我不明白该怎么做。

python-3.x 读取行 python-zip文件

评论

0赞 Botje 7/6/2023
要知道,如果您的 SQL 语句在字符串值中包含分号,则此方法将中断。

答:

1赞 Botje 7/6/2023 #1

没有选项可以配置 (返回的内容) 的行结束字符。ZipExtFilezip.open(...)

但是,您可以使用一个简单的函数创建自己的缓冲读取器:

from io import BytesIO
def delimited_read(f, sep, block_size=16384):
    buf = bytearray()
    while True:
        idx = buf.find(sep)
        while idx == -1:
            block = f.read(block_size)
            if block == b'':
                break
            start = len(buf)
            buf.extend(block)
            idx = buf.find(sep, start)
        if idx == -1:
            if len(buf) > 0:
                yield bytes(buf)
            return
        else:
            yield bytes(buf[0:idx])
            buf = buf[idx+1:]

您可以简单地将其用作:

for line in delimited_read(f, b';'):
  print(line)

评论

0赞 kiks73 7/6/2023
TextIOWrapper 不接受 ';' 作为换行符,而只接受 '\n' 或 '\r\n'
0赞 Botje 7/6/2023
真的?真是太可惜了:(
0赞 Botje 7/6/2023
我现在用自定义缓冲阅读器重写了我的答案。