我想编写一个脚本,该脚本接收目录的路径和该目录中包含的文件的路径(可能嵌套很多目录)并返回相对于外部目录的该文件的路径。
例如,如果外部目录为/home/hugomg/foo
且内部文件为/home/hugomg/foo/bar/baz/unicorns.txt
,我希望脚本输出bar/baz/unicorns.txt
。
现在我正在使用realpath
和字符串操作:
import os
dir_path = "/home/hugomg/foo"
file_path = "/home/hugomg/foo/bar/baz/unicorns.py"
dir_path = os.path.realpath(dir_path)
file_path = os.path.realpath(file_path)
if not file_path.startswith(dir_path):
print("file is not inside the directory")
exit(1)
output = file_path[len(dir_path):]
output = output.lstrip("/")
print(output)
但是有更强大的方法吗?我不相信我目前的解决方案是正确的方法。使用startwith和realpath一起使用正确的方法测试一个文件是否在另一个文件中?有没有办法避免使用我可能需要删除的主要斜线的那种尴尬局面?
答案 0 :(得分:1)
您可以使用commonprefix
模块的relpath
和os.path
来查找两条路径的最长公共前缀。始终首选使用realpath
。
import os
dir_path = os.path.realpath("/home/hugomg/foo")
file_path = os.path.realpath("/home/hugomg/foo/bar/baz/unicorns.py")
common_prefix = os.path.commonprefix([dir_path,file_path])
if common_prefix != dir_path:
print("file is not inside the directory")
exit(1)
print(os.path.relpath(file_path, dir_path))
输出:
bar/baz/unicorns.txt