我对Python中处理路径的方式感到有些困惑。使用常用结构行“〜”或“。”或“..”,我经常遇到路径未被识别为有效或存在的情况,特别是如果我将路径作为参数传递给shell命令;但如果总是做类似的事情,所有我的问题就会消失:
some_path = os.path.abspath(os.path.expanduser(some_path))
这是一种常见的 - 或者甚至是必需的 - 成语,还是我只是重新发明轮子?我真的希望无论我在哪里some_path
,我都应该将上面的代码传递给任何(或至少大多数)与它有关的函数吗?
答案 0 :(得分:2)
是的,您可以调用的大多数内容都会指向已经通过该成语运行的路径。当您在shell中使用类似的路径时(例如,当您执行类似cat ~raxacoricofallapatorius/foo.txt
的操作时),它是 shell本身 - 而不是cat
或您可能的任何其他程序run - 执行路径规范化。
您可以轻松验证这一点 - 例如,
lvc@tiamat:~/Projects$ echo ~
/home/lvc
所以这意味着如果你希望得到一个带有这些变量的路径作为输入,你需要自己进行预处理。另一种方法是通过shell运行命令,并准备好处理带来的所有问题。
但是,至少在类似unix的系统上(Windows可能会或可能不会以相同的方式运行), 不需要为.
和{{1}执行此操作 - 系统调用可以理解这些,而shell不会对它们进行转换 - 例如:
..
请注意,lvc@tiamat:~/Projects$ file ..
..: directory
lvc@tiamat:~/Projects$ file ~
/home/lvc: directory
看到file
未更改,但会看到..
的扩展形式。
这意味着如果你想要的只是直接在外部程序中工作的路径,那么将它传递给~
和expanduser
就足够了。如果您呼叫的程序将运行在与您不同的工作目录中,您将主要致电expandvars
。
答案 1 :(得分:1)
是的,如果你需要一个已解决$HOME
的绝对路径,你就必须这样做。
如果您需要定期执行此功能,那么编写简短的辅助函数应该很容易。还有路径助手库可用,如下所示:
答案 2 :(得分:-1)
这通常是一个好主意。 os.path.abspath将解析相对路径,如。,..和〜。如果您希望代码可以在OS上移植,那么您应该使用os.path而不是定义自己的路径处理,如果可以的话 - os.path始终指向您所在操作系统的正确路径模块。如果尝试定义自己的路径函数,则会丢失os.path的内置跨平台行为。