解决:Python的os.popen()在read()时,出现“�Ҳ����ļ�乱码及结果错误”的问题

文章讲述了在Python中使用os.popen处理含空格目录路径时出现的乱码和解析错误问题,以及解决方案。通过在路径字符串外添加英文双引号可解决cmd对空格的敏感问题,同时提到了在使用原始字符串(r)时,路径中反斜杠的正确使用方法,避免额外的转义字符影响cmd的识别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1、问题 复现

2、解决 措施

3、原因

4、其他原因及解决办法


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:\\'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值