我有以下代码,预计将执行以下操作,
这样做的动机是,一旦确定了文件(满足前缀),我就希望该文件的绝对真实路径。我尝试使用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
答案 0 :(得分:2)
几个问题:
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
还可以构造一个球形图案,以进一步简化该图案。可能很简单:
Path(dirName).glob('*/prefix*')
或者,
[p.resolve() for p in Path(dirName).glob('*/prefix*') if p.is_file()]
在一个目录下找到您想要的前缀的文件。
答案 1 :(得分:1)
更改此行:
return(Path(libfile).resolve())
对此:
return (Path(dirname) / libfile).resolve()
我同意the comment from dawg的观点,在这里使用递归glob模式将是更好的选择。