目录
1、问题 复现
(1)新建有2个空文件夹:
(2)运行代码:
#! /usr/bin/env python3
# -*- coding: UTF-8 -*-
import os
import time
def getDirList(dir_path):
res = os.popen(f'dir {dir_path}')
print(res.read())
if __name__ == '__main__':
# 1
my_dir_path = r'D:\2008文档\★ 123'
getDirList(my_dir_path)
time.sleep(1)
print('========================')
print('本次运行脚本的路径:' + __file__)
print('========================')
# 2
my_dir_path = r'D:\2008文档\★中文'
getDirList(my_dir_path)
(3)运行结果:
可以看到:实际上,不仅是出现了乱码问题,所返回的目录信息也是异常的(如:出现了本次运行脚本的目录信息……)
2、解决 措施
在目录路径的外围(且在字符串内),再加一对英文双引号(形如:"$path")即可,如下:
# 原来
# my_dir_path = r'D:\★ 123'
# 修改后
my_dir_path = r'"D:\★ 123"'
(2)代码验证:
#! /usr/bin/env python3
# -*- coding: UTF-8 -*-
import os
import time
def getDirList(dir_path):
res = os.popen(f'''dir {dir_path}''')
print(res.read())
if __name__ == '__main__':
# 1(字符串中的“路径”外围,加入了一对英文双引号)
my_dir_path = r'"D:\2008文档\★ 123"'
getDirList(my_dir_path)
time.sleep(1)
print('========================')
print('本次运行脚本的路径:' + __file__)
print('========================')
# 2
my_dir_path = r'D:\2008文档\★中文'
getDirList(my_dir_path)
(3)验证结果:(正常)
3、原因
解决问题之初,本以为是“特殊字符+空格”导致问题的。多次尝试问题复现后,才发现归因错误——真正的问题制造者,就是“空格”。
os.popen() 方法,实质上是Python在cmd中输入我们设置的命令,并返回cmd执行后的结果(相当于Python外包给了cmd)。
而cmd对空格敏感(类似于Python中的str.split() 方法),会将含有空格的字符串内容断开,导致cmd无法识别命令而出错。
借助英文形式双引号,则令cmd将该含有空格的字符串内容,看作一个整体/参数。
4、其他原因及解决办法
如果在使用Python中的字符串时,习惯在路径字符串前添加“r”,如下:
my_dir_path = r'"D:\2008文档"'
那就需要注意:在路径名的字符串末尾,不得不添加类如“\”(反斜杠)的字符的情况下,应使用“/”(正斜杠)字符,而非“\\”。
原因:
字符串前缀r,表示该字符串是原始字符串,即没有转义符,所含字符全为单纯的符号。
同时,r'xxxx\' 这样以单一的反斜杠字符结尾的形式,是无法通过python解释器的(不清楚这是不是个bug……)。而使用r'xxxx\\'字符串可以通过python解释器,但会多出一个“无处安放”的反斜杠,导致cmd无法识别。
示例语句如下:
# 以下3句中, 路径字符串 的语义是等价、正确的
# 1
my_dir_path = r'D:/'
# 2
my_dir_path = 'D:/'
# 3
my_dir_path = 'D:\\'
# xxxxxxxxxxxxxxxxxxxxxxxxxx
# 错误的写法
my_dir_path = r'D:\\'