甜萝 发表于 2022-8-20 19:17

os.path.join()函数的困惑

本帖最后由 paypojie 于 2022-8-21 09:10 编辑

                                                                                                       细微差别带来的困扰

先获取当前目录所在的路径(绝对路径) |方便实际测试| 然后将获取到的路径与文件路径连接



在这里 为什么路径('C:\\Users\\Administrator')连接文件路径('testdir')的分隔符是\\ 为啥是两个反斜杠 按道理来说 windows的文件分隔符默认是一个反斜杠实际连接目录不是一个反斜杠 而是两个反斜杠

百度了一下
windows 文件分隔符1.windows 同时支持两种文件分隔符“/”,“\”且两种分隔符具备同等地位;2.当windows遇见多个连续的分隔符时,会当做一个分隔符进行处理更多 >

python文件分隔符1.目录中的斜杠们 python读文件需要输入的目录参数,列出以下例子: path = r"C:\User\temp\python.t...2.正则表达式中的斜杠们 正则表达式匹配反斜杠"",为什么是"\\“或是 r”\"呢? 因为在正则表达式...更多 >

第二种情况


路径前面加r 为什么实际连接的时候是 'C:\\Users\\Administrator\\testdir' 我期望输出的结果应该是 'C:\Users\Administrator\testdir'难道是在os.path.join()下 反斜杠不表示转义符 反斜杠就是反斜杠 在路径前面加r 表示后面的路径字符串是原始含义 print()函数中用两个反斜杠表示输出时输出为一个反斜杠 逆推一下 一个反斜杠的原始含义就是两个反斜杠

第三种情况


上面的截图中path是不能用一个反斜杠来连接的 因为反斜杠表示转义字符 用正斜杠可以连接 因为windows支持两种文件分隔符 正斜杠和反斜杠都支持 但是python要用两个反斜杠来表示一个反斜杠



这里 没有报错 不知道能不能这么理解 在windows下 文件分隔符支持正斜杠和反斜杠 在os.path.join()函数中 默认是反斜杠作为文件路径连接符 但是python中 一个反斜杠表示转义 所以 必须用两个反斜杠来表示一个反斜杠 输出的时候 不会将文件路径中的两个反斜杠输出为一个 而是输出两个反斜杠

vscode下运行的结果



晕。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 感觉又无法理解了




原因出在这 在cmd下 我一直都是直接调用os.path.join()这个函数 而不是print(os.path.join()) 如果把os.path.join()这个函数传递到print() 由print输出 那么我预估结果和vscode下是一样的 命令行交互式下运行和在文本编辑器运行的习惯 因为这个细节 想了半天

总结一下 调用os.path.join()返回的是'C:\\Users\\Administrator'    print('C:\\Users\\Administrator')输出时 会输出 'C:\Users\Administrator' 在python中 要用两个反斜杠来表示一个反斜杠 所以 直接调用os.path.join(参数一,参数二)时 返回的是由两个反斜杠组成的路径 用print(os.path.join(参数一,参数二))的时候 返回的是一个反斜杠组成的路径区别在于直接调用函数与用print输出函数调用的结果 直接调用函数 获取的是两个反斜杠的目录 print输出函数调用结果 会转化 在屏幕上显示一个反斜杠的目录windows实际目录 'C:\Users\Administrator' python解释器认为一个反斜杠有特殊含义 所以 要用两个反斜杠来表示'C:\\Users\\Administrator'


晚上回来 看有没有令人激动的评论 会回复大多数评论 或者支持
有用的贴子 https://www.52pojie.cn/thread-1654389-1-1.html
顺便提一下 百度一下 ys168.com 会得到有用的资料哦 不是在浏览器地址栏直接输入网址 因为那样会跳转到永硕E盘 要在百度搜索框输入ys168.com也可以在浏览器地址栏随便输入一些东西 然后在百度搜索框清除内容 最后输入那串网址

bester 发表于 2022-8-20 19:30

终端那里显示的字体能改嘛 感觉你的好大哎

luliucheng 发表于 2022-8-20 20:11

本帖最后由 luliucheng 于 2022-8-20 20:13 编辑

楼主您好,在原始字符串里需要用\\,因为\具有转义作用,所以规定表示\时需用\\。简单来说,电脑中想输入\时要输入\\,print时\\会变回\。
原来楼主已经总结了呀,怎么眼瞎没看见{:301_1009:}
顺便加一句,在python中直接输入变量名显示的是原始表达,输入print时出现的就是转义后的表达。

jokerswift 发表于 2022-8-20 20:17

用pathlib.Path啊。比os.path好用太多

fufuok 发表于 2022-8-20 20:17

本帖最后由 fufuok 于 2022-8-20 20:20 编辑

先了解一下字符串中嵌入单双引号的问题:
想要表示这样的字符串(空格 a 单引号 b 双引号):
a'b"

a = ' a\'b" '

b = " a'b\" "

c = ''' a'b" '''

d = """ a'b" """

此时: a == b and b == c and c == d

反斜杠是转义符可以看到引号中要表示相同的引号字符, 就要用它.
那要表示反斜杠, 则要用 2 个双斜杠来表示了.

转义字符      说明
\n      换行符,将光标位置移到下一行开头。
\r      回车符,将光标位置移到本行开头。
\t      水平制表符,也即 Tab 键,一般相当于四个空格。
\a      蜂鸣器响铃。注意不是喇叭发声,现在的计算机很多都不带蜂鸣器了,所以响铃不一定有效。
\b      退格(Backspace),将光标位置移到前一列。
\\      反斜线
\'      单引号
\"      双引号
\      在字符串行尾的续行符,即一行未完,转到下一行继续写。

转义字符在书写形式上由多个字符组成,但 Python 将它们看作是一个整体,表示一个字符。

所以要表示 Linux 路径, 因为是正斜杠, 不涉及转义, 直接普通字符串书写就行:

p = '/mnt/e/Python'

p = "/mnt/e/Python"

p = '''/mnt/e/Python'''

p = """/mnt/e/Python"""

但 Windows 路径一般用反斜杠, 反斜杠自身是转义符, 得用 \\ 来表示字符含义表示为一个 \

p = 'E:\\Python'

p = "E:\\Python"

p = '''E:\\Python'''

p = """E:\\Python"""

最后是 r 前缀, 表示后续的字符串是普通字符, 不涉及转义, 比如 r'\\' 表示 2 个反斜杠, 而要表示 1 个反斜杠, 用 r'\' 就可以.

p = r'E:\Python'

p = r"E:\Python"

p = r'''E:\Python'''

p = r"""E:\Python"""


多用于正则表达式, 因为要表示的字符复杂度高, 太多转义让人看着不够清晰, 不经意的错误转义容易引发 BUG.

控制台显示的结果是同上面以单引号或双引号表示的标准写法.

pangdundun 发表于 2022-8-20 20:49

我期望输出的结果应该是 'C:\Users\Administrator\testdir'
说个不相关的,您可以追加.replace('\\', '\')

ccwuax 发表于 2022-8-20 21:48

这不是Python的基础知识吗??????

甜萝 发表于 2022-8-20 22:20

bester 发表于 2022-8-20 19:30
终端那里显示的字体能改嘛 感觉你的好大哎

默认就这样了 懒得改

甜萝 发表于 2022-8-20 22:21

luliucheng 发表于 2022-8-20 20:11
楼主您好,在原始字符串里需要用\\,因为\具有转义作用,所以规定表示\时需用\\。简单来说,电脑中想输入\ ...

有时候很难表述那个意思 汉字博大精深{:301_997:}

甜萝 发表于 2022-8-20 22:23

ccwuax 发表于 2022-8-20 21:48
这不是Python的基础知识吗??????

是的 只是有些东西感到有些困扰{:301_1001:}
页: [1] 2
查看完整版本: os.path.join()函数的困惑