New submission from Jörn Heissler <[email protected]>:
Hello,
#!/usr/bin/python3.8
from zipfile import ZipFile, Path
import io
def recurse_print(parent):
for child in parent.iterdir():
if child.is_file():
print(child, child.read_text())
if child.is_dir():
recurse_print(child)
data = io.BytesIO()
zf = ZipFile(data, "w")
zf.writestr("a.txt", "content of a")
zf.writestr("b/c.txt", "content of c")
zf.writestr("b/d/e.txt", "content of e")
zf.writestr("b/f.txt", "content of f")
zf.filename = "abcde.zip"
root = Path(zf)
recurse_print(root)
Expected result:
abcde.zip/a.txt content of a
abcde.zip/b/c.txt content of c
abcde.zip/b/f.txt content of f
abcde.zip/b/d/e.txt content of e
Actual result:
abcde.zip/a.txt content of a
abcde.zip/b/c.txt content of c
abcde.zip/b/f.txt content of f
abcde.zip/b/d/e.txt content of e
abcde.zip/b/c.txt content of c
abcde.zip/b/f.txt content of f
abcde.zip/b/d/e.txt content of e
Path._add_implied_dirs adds the sub directory "b/" twice: once for each direct
child (i.e. "c.txt" and "f.txt")
And similarly:
data = io.BytesIO()
zf = ZipFile(data, "w")
zf.writestr("a.txt", "content of a")
zf.writestr("b/d/e.txt", "content of e")
zf.filename = "abcde.zip"
root = Path(zf)
recurse_print(root)
Expected result:
abcde.zip/a.txt content of a
abcde.zip/b/d/e.txt content of e
Actual result:
abcde.zip/a.txt content of a
Here, Path._add_implied_dirs doesn't add "b/" at all, because there are no
direct childs of "b".
----------
components: Library (Lib)
messages: 349101
nosy: joernheissler
priority: normal
severity: normal
status: open
title: zipfile.Path.iterdir() outputs sub directories many times or not at all
type: behavior
versions: Python 3.9
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue37772>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com