return found path in glob

Question:

If I have a glob('path/to/my/**/*.json', recursive = True), function returns something like:

path/to/my/subfolder1/subfolder2/file1.json
path/to/my/subfolder1/subfolder2/file2.json
path/to/my/subfolder1/subfolder2/file3.json
path/to/my/subfolder1/file4.json
path/to/my/file5.json
...

I’d like to get only part that starts after ** in the glob, so

subfolder1/subfolder2/file1.json
subfolder1/subfolder2/file2.json
subfolder1/subfolder2/file3.json
subfolder1/file4.json
file5.json
...

What is the best way to do it? Does glob support it natively? Glob input is provided as commmand line hence direct str-replace may be difficult.

Asked By: tilz0R

||

Answers:

Use os.path.commonprefix on the returned paths, then os.path.relpath using the common prefix to get paths relative to it.

An example from a Node.js project with a whole bunch of package.jsons.

>>> pkgs = glob.glob("node_modules/**/package.json", recursive=True)[:10]
['node_modules/queue-microtask/package.json', 'node_modules/callsites/package.json', 'node_modules/sourcemap-codec/package.json', 'node_modules/reusify/package.json', 'node_modules/is-bigint/package.json', 'node_modules/which-boxed-primitive/package.json', 'node_modules/jsesc/package.json', 'node_modules/@types/scheduler/package.json', 'node_modules/@types/react-dom/package.json', 'node_modules/@types/prop-types/package.json']
>>> pfx = os.path.commonprefix(pkgs)
'node_modules/'
>>> [os.path.relpath(pkg, pfx) for pkg in pkgs]
['queue-microtask/package.json', 'callsites/package.json', 'sourcemap-codec/package.json', 'reusify/package.json', 'is-bigint/package.json', 'which-boxed-primitive/package.json', 'jsesc/package.json', '@types/scheduler/package.json', '@types/react-dom/package.json', '@types/prop-types/package.json']
>>>
Answered By: AKX
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.