提问人:kiks73 提问时间:7/6/2023 更新时间:7/6/2023 访问量:22
如何使用特定的字符作为换行符而不是\n来读取ZIpFile?
How to read a ZIpFile using a specific char as newline separator, instead of \n?
问:
我有这个代码:
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文件时,我不明白该怎么做。
答:
1赞
Botje
7/6/2023
#1
没有选项可以配置 (返回的内容) 的行结束字符。ZipExtFile
zip.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
我现在用自定义缓冲阅读器重写了我的答案。
评论