在unix中查找文件的真实路径
Finding the realpath of a file in unix
我有以下代码,预计会执行以下操作,
- 提供目录名称 (dirName) 和前缀作为函数的输入。
- 列出从提供的输入目录 (dirName) 向下一级的所有内容,并使用 os.walk 函数开始在子目录中填充文件详细信息。
- 找到文件后,将根据特定前缀检查它们并进一步处理。
动机是一旦识别出一个文件(满足前缀),我想要那个文件的绝对真实路径。我尝试使用 Path(libfile).resolve() 选项,但它只给出脚本所在的当前工作目录 运行 而不是该文件的真实路径。你能解释一下我哪里出错了吗?
import os
from pathlib import Path
def directory(dirName, prefix):
process_dir = [name for name in os.listdir(dirName) if os.path.isdir(os.path.join(dirName, name))]
for entry in process_dir:
for dirname, directory, files in os.walk(os.path.join(dirName, entry)):
for libfile in files:
if libfile.startswith((prefix)):
return(Path(libfile).resolve())
Python 版本 3.6.2.
更改此行:
return(Path(libfile).resolve())
为此:
return (Path(dirname) / libfile).resolve()
我同意 在这里使用递归 glob 模式是更好的选择。
几个问题:
1) 您只返回一个文件
2) 您调用 .resolve
时只有一个文件名,因此解析路径的位置取决于当前的工作目录。
3) 您的规范声明您只想在目录树中下降一级,但您没有修剪 os.walk
正在采用的下降路径。
我建议放弃 os.walk
并充分使用 Path
。
您说只需要下一层的文件;这意味着你需要用 Path
:
走那个水平
file_names=[]
for d in (p for p in Path(dirName).glob('*') if p.is_dir()):
ab_path=d.resolve()
file_names+=[fn for fn in Path(ab_path).iterdir() if fn.is_file() and fn.name.startswith(prefix)]
return file_names
也可以构建一个 glob 模式来进一步简化它。它可能很简单:
Path(dirName).glob('*/prefix*')
或者,
[p.resolve() for p in Path(dirName).glob('*/prefix*') if p.is_file()]
以您查找的前缀在下一级目录中查找文件。
我有以下代码,预计会执行以下操作,
- 提供目录名称 (dirName) 和前缀作为函数的输入。
- 列出从提供的输入目录 (dirName) 向下一级的所有内容,并使用 os.walk 函数开始在子目录中填充文件详细信息。
- 找到文件后,将根据特定前缀检查它们并进一步处理。
动机是一旦识别出一个文件(满足前缀),我想要那个文件的绝对真实路径。我尝试使用 Path(libfile).resolve() 选项,但它只给出脚本所在的当前工作目录 运行 而不是该文件的真实路径。你能解释一下我哪里出错了吗?
import os from pathlib import Path def directory(dirName, prefix): process_dir = [name for name in os.listdir(dirName) if os.path.isdir(os.path.join(dirName, name))] for entry in process_dir: for dirname, directory, files in os.walk(os.path.join(dirName, entry)): for libfile in files: if libfile.startswith((prefix)): return(Path(libfile).resolve())
Python 版本 3.6.2.
更改此行:
return(Path(libfile).resolve())
为此:
return (Path(dirname) / libfile).resolve()
我同意
几个问题:
1) 您只返回一个文件
2) 您调用 .resolve
时只有一个文件名,因此解析路径的位置取决于当前的工作目录。
3) 您的规范声明您只想在目录树中下降一级,但您没有修剪 os.walk
正在采用的下降路径。
我建议放弃 os.walk
并充分使用 Path
。
您说只需要下一层的文件;这意味着你需要用 Path
:
file_names=[]
for d in (p for p in Path(dirName).glob('*') if p.is_dir()):
ab_path=d.resolve()
file_names+=[fn for fn in Path(ab_path).iterdir() if fn.is_file() and fn.name.startswith(prefix)]
return file_names
也可以构建一个 glob 模式来进一步简化它。它可能很简单:
Path(dirName).glob('*/prefix*')
或者,
[p.resolve() for p in Path(dirName).glob('*/prefix*') if p.is_file()]
以您查找的前缀在下一级目录中查找文件。