New submission from Jörn Heissler <launchpad2...@tutnicht.de>: 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 <rep...@bugs.python.org> <https://bugs.python.org/issue37772> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com