吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1541|回复: 15
收起左侧

[讨论] os.path.join()函数的困惑

[复制链接]
甜萝 发表于 2022-8-20 19:17
本帖最后由 paypojie 于 2022-8-21 09:10 编辑

                                                                                                       细微差别带来的困扰

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

QQ截图20220820110435.png

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

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

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

第二种情况
QQ截图20220820110435.png

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

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

QQ截图20220820115347.png

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

vscode下运行的结果
QQ截图20220820123832.png


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

QQ截图20220820125230.png


原因出在这 在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  也可以在浏览器地址栏随便输入一些东西 然后在百度搜索框清除内容 最后输入那串网址

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
hualili + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

bester 发表于 2022-8-20 19:30
终端那里显示的字体能改嘛 感觉你的好大哎
luliucheng 发表于 2022-8-20 20:11
本帖最后由 luliucheng 于 2022-8-20 20:13 编辑

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

先了解一下字符串中嵌入单双引号的问题:
想要表示这样的字符串(空格 a 单引号 b 双引号):
[Python] 纯文本查看 复制代码
 a'b" 


[Python] 纯文本查看 复制代码
a = ' a\'b" '

b = " a'b\" "

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

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


此时:
[Python] 纯文本查看 复制代码
a == b and b == c and c == d


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

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

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

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

[Python] 纯文本查看 复制代码
p = '/mnt/e/Python'

p = "/mnt/e/Python"

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

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


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

[Python] 纯文本查看 复制代码
p = 'E:\\Python'

p = "E:\\Python"

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

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


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

[Python] 纯文本查看 复制代码
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'

说个不相关的,您可以追加
[Python] 纯文本查看 复制代码
.replace('\\', '\')

点评

那也应该是.replace('\\\\', '\\')吧。。。  详情 回复 发表于 2022-8-20 22:52
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
楼主您好,在原始字符串里需要用\\,因为\具有转义作用,所以规定表示\时需用\\。简单来说,电脑中想输入\ ...

有时候很难表述那个意思 汉字博大精深
 楼主| 甜萝 发表于 2022-8-20 22:23
ccwuax 发表于 2022-8-20 21:48
这不是Python的基础知识吗??????

是的 只是有些东西感到有些困扰  
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 07:29

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表