怎么在 python 中单独输出反斜杠\为字符串?

2015-11-07 01:59:29 +08:00
 YaphetYin

前一阵有看到这个问题,可惜找不到了,就再来求安利一下~


情况是这样的,有个文件文件名为'\u5feb\u901f\u4e0a\u4f20'

然后我用os.listdir('.')显示的时候它自动给反斜杠转义了,就成了'\\u5feb\\u901f\\u4e0a\\u4f20'

那么问题来了,怎样把双斜杠替换为单斜杠?

我尝试用字符串的 replace ,可是a.replace('\\', '\')会因为反斜杠把单引号转义了而找不到字符串结束符报错,用a.replace(r'\\', r'\')也不行。

有什么好方法可以助我目标达成吗?

22464 次点击
所在节点    Python
13 条回复
RickyBoy
2015-11-07 03:53:00 +08:00
decode('unicode_escape') 直接显示中文不好么
RickyBoy
2015-11-07 05:06:12 +08:00
接楼上,如果文件名本身就是 '\u5feb\u901f\u4e0a\u4f20' 的话, os.listdir 输出的列表肯定是 '\\u5feb\\u901f\\u4e0a\\u4f20' 的形式的, for 一下单独显示字符串的话就没有了
Sylv
2015-11-07 06:52:24 +08:00
>>> name = '\u5feb\u901f\u4e0a\u4f20'
>>> print name
\u5feb\u901f\u4e0a\u4f20
>>> print repr(name)
'\\u5feb\\u901f\\u4e0a\\u4f20'
>>> print [name]
['\\u5feb\\u901f\\u4e0a\\u4f20']
>>> print [name][0]
\u5feb\u901f\u4e0a\u4f20
binux
2015-11-07 07:04:25 +08:00
这是一个 XY 问题
jimzhong
2015-11-07 08:12:20 +08:00
为什么要转啊?你看到的是转义后的字符串。
des
2015-11-07 08:19:47 +08:00
3.4

>>> name = '\u5feb\u901f\u4e0a\u4f20'
>>>
>>> print name
SyntaxError: Missing parentheses in call to 'print'
>>> print(name)
快速上传
p1n3
2015-11-07 11:00:09 +08:00
python2.7

>>> print u'\u5feb\u901f\u4e0a\u4f20'
快速上传
>>> print '\\'
\
Cu635
2015-11-07 11:04:28 +08:00
@des python3 里面 print 必须加括号了。不能直接“ print xxx ”了。
Kisesy
2015-11-07 12:50:14 +08:00
其实在程序内部是单斜杠,只是给你显示为双斜杠
YaphetYin
2015-11-07 12:57:38 +08:00
@RickyBoy `decode('unicode_escape')`是正解,今天试了一下成功了
YaphetYin
2015-11-07 13:09:48 +08:00
@p1n3
@Kisesy
@jimzhong
@binux

Bingo!

其实 listdir 出来的字符串'\\u5feb'就是'\u5feb',这么说可能有些 confusing ,这样可能容易理解一点:

name = '\\u5feb'
name[0] = '\\'

也就是说'\\u5feb'中第一个反斜杠不是字符串的一部分,而是用于转义第二个反斜杠的。所以大一开始我的思路就不对了,应该用 decode('unicode_escape') 来解决。
overvenus
2015-11-07 13:24:58 +08:00
➜ ~ python3
Python 3.4.3 (default, Oct 14 2015, 20:28:29)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> name = """\u5feb\u901f\u4e0a\u4f20"""
>>> print(name)
快速上传
>>> print(repr(name))
'快速上传'
>>> name = r"""\u5feb\u901f\u4e0a\u4f20"""
>>> print(name)
\u5feb\u901f\u4e0a\u4f20
>>>
fyyz
2015-11-07 13:51:48 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/234313

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX