Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么驱动器号的绝对路径等于工作目录?_Python_Path_Relative Path - Fatal编程技术网

Python 为什么驱动器号的绝对路径等于工作目录?

Python 为什么驱动器号的绝对路径等于工作目录?,python,path,relative-path,Python,Path,Relative Path,我在使用python的os.path模块时遇到了非常奇怪的行为。工作目录的驱动器号被视为工作目录本身的相对路径。例如: 使用os.path.abspath os.path.abspath('.')打印'C:\\Users\\myuser' os.path.abspath('C:')还打印'C:\\Users\\myuser' 使用os.path.join os.path.join('.','Users','myuser')给出预期的。\\Users\\myuser' 注意,“\\”插入到所有三个

我在使用python的
os.path
模块时遇到了非常奇怪的行为。工作目录的驱动器号被视为工作目录本身的相对路径。例如:

使用
os.path.abspath
os.path.abspath('.')
打印
'C:\\Users\\myuser'

os.path.abspath('C:')
还打印
'C:\\Users\\myuser'

使用
os.path.join
os.path.join('.','Users','myuser')
给出预期的
。\\Users\\myuser'

注意,
“\\”
插入到所有三个条目之间。然而:

os.path.join('C:','Users','myuser')
给出了
'C:Users\\myuser'

请注意,在
C:
用户之间插入
'\\\'
的代码不多

使用
os.path.abspath
os.path.join
尽管缺少
'\\'
,python还是接受
'C:Users'
,并将其视为
。\\Users'
,如下所示:

'os.path.abspath(os.path.join('C:','Users','myuser'))
给出
'C:\\Users\\J34688\\Users\\myuser'

这和
'os.path.abspath(os.path.join('.','Users','myuser'))
给出
'C:\\Users\\J34688\\Users\\myuser'

使用不同的驱动器号 使用其他驱动器时,不会出现此意外行为。例如:

os.path.abspath(os.path.join('D:','Users','myuser'))
'D:\\Users\\myuser'

这在我看来更合理

结论 这是怎么回事?为什么
'C:'
被视为
。\\'

附加说明
  • 我找到了一个解决方法,通过使用
    'C:\\'
    强制执行预期行为,它将被视为实际的盘符。不过,在其他任何情况下,
    '\\'
    都是可选的(例如,
    '.
    相当于
    '.\\'
    'D:'
    相当于
    'D:\'
  • 无论您当前的工作目录是什么,此“功能”都有效。如果您将
    cd
    转到
    C:
    驱动器中的另一个目录,则
    'C:'
    将像
    '一样引用该新目录。
    。此外,如果您换到另一个驱动器(例如,
    D:
    ),则
    'C:'
    将按预期运行,新字母将采用此行为(例如,
    'D:'
    现在相当于
    '。

    • Windows API中的os.path.abspath调用。该文件规定:

      如果指定“U:,则返回的路径是“U:”驱动器上的当前目录

      这只是Windows处理路径的方式,与Python无关

      文件也适用于各国

      请注意,因为每个驱动器都有一个当前目录,所以os.path.join(“c:,“foo”)表示相对于驱动器c:(c:foo)上当前目录的路径,而不是c:\foo


      os.path.abspath
      在Windows API中调用。该文件规定:

      如果指定“U:,则返回的路径是“U:”驱动器上的当前目录

      这只是Windows处理路径的方式,与Python无关

      文件也适用于各国

      请注意,因为每个驱动器都有一个当前目录,所以os.path.join(“c:,“foo”)表示相对于驱动器c:(c:foo)上当前目录的路径,而不是c:\foo


      我想这就是Windows处理相对路径名的方式,我不认为这是Python特有的。试试
      pathlib
      。有一些特定于平台的
      Path
      对象可以操作路径。@Barmar By golly你说得对。。。在cmd提示符中使用“cd C:Documents”与“cd\\Documents”相同。MS从未停止让我惊讶…尽管如此。。。为什么os.path.join不像在其他情况下那样包含“\\”?
      os.path.join()
      如果给它相对路径,它不会返回绝对路径。我想这就是Windows处理相对路径名的方式,我不认为这是Python特有的。试试
      pathlib
      。有一些特定于平台的
      Path
      对象可以操作路径。@Barmar By golly你说得对。。。在cmd提示符中使用“cd C:Documents”与“cd\\Documents”相同。MS从未停止让我惊讶…尽管如此。。。为什么os.path.join不像在其他情况下那样包含“\\”?
      os.path.join()
      如果给它相对路径,它不会返回绝对路径。谢谢!对
      GetFullPathName
      的API调用很有意义。我从来不知道Windows将
      C:Path
      视为
      \\Path
      。不过,我必须承认,
      os.path.join
      文档对我来说太过分了,但我相信比我聪明的人有很好的理由实现它!我认为这是可以接受的。在像Python这样的跨平台系统中,在做特定操作系统的用户可能期望的事情(例如,您在这里看到的行为)和做一些不同的事情(例如,将其视为“C:\whatever”)之间可以有一条很好的界限。由于驱动器号的行为必须是特定于Windows的,因此他们可能认为遵循底层平台提供的行为是有意义的,而不是试图修改它,这可能会变得非常复杂。谢谢!对
      GetFullPathName
      的API调用很有意义。我从来不知道Windows将
      C:Path
      视为
      \\Path
      。不过,我必须承认,
      os.path.join
      文档对我来说太过分了,但我相信比我聪明的人有很好的理由实现它!我认为这是可以接受的。在像Python这样的跨平台系统中,在做特定操作系统的用户可能期望的事情(例如,你在这里看到的行为)和做一些不同的事情之间,可以有一条很好的界限