无法在 Python 中获取绝对路径

Can't get absolute path in Python

我尝试使用 os.path.abspath(file)Path.absolute(file) 来获取我正在处理的 .png 文件的路径,这些文件位于与项目文件夹不同的驱动器上代码在其中。以下脚本的结果是“code/filename.png 的项目文件夹”,而显然我需要的是 .png 所在文件夹的路径;

for root, dirs, files in os.walk(newpath):
    for file in files:
        if not file.startswith("."):
            if file.endswith(".png"):
                number, scansize, letter = file.split("-")
                filepath = os.path.abspath(file)
                # replace weird backslash effects
                correctedpath = filepath.replace(os.sep, "/")
                newentry = [number, file, correctedpath]
                textures.append(newentry)

我在这里阅读了其他答案,这些答案似乎表明代码的项目文件不能与正在处理的文件夹位于同一目录中。但这里不是这种情况。有人可以指出我没有得到什么吗?我需要绝对路径,因为程序的目的是将文件的路径写入文本文件。

我最近刚写了一些你要找的东西。

此代码假设您的文件是路径的末尾。 找目录之类的不合适

不需要嵌套循环。


DIR = "your/full/path/to/direcetory/containing/desired/files"

def get_file_path(name, template):
    """
    @:param template:  file's template (txt,html...)
    @return: The path to the given file.
    @rtype: str
    """
    substring = f'{name}.{template}'
    for path in os.listdir(DIR):
        full_path = os.path.join(DIR, path)
        if full_path.endswith(substring):
            return full_path

结果来自

for root, dirs, files in os.walk(newpath):

files 只包含文件名,没有目录路径。 仅使用文件名意味着 python 默认情况下使用您的项目文件夹作为这些文件名的目录。在您的情况下,文件位于新路径中。您可以使用 os.path.join 为找到的文件名添加目录路径。

filepath = os.path.join(newpath, file)

如果您想在子目录中查找 png 文件,最简单的方法是使用 glob:

import glob

newpath = r'D:\Images'


file_paths = glob.glob(newpath + "/**/*.png", recursive=True)

for file_path in file_paths:
    print(file_path)

您可以在此处使用 pathlib.Path.rglob 递归获取所有 png:

作为列表理解:

from pathlib import Path
search_dir = "/path/to/search/dir"
# This creates a list of tuples with `number` and the resolved path
paths = [(p.name.split("-")[0], p.resolve()) for p in Path(search_dir).rglob("*.png")]

或者,您可以循环处理它们:

paths = []
for p in Path(search_dir).rglob("*.png"):
    number, scansize, letter = p.name.split("-")
    # more processing ...
    paths.append([number, p.resolve()])