Python 3遍历subprocess输出查找指定文件名的问题求助
嘿,我来帮你排查下问题出在哪,以及怎么修复这段代码~
首先说原代码的两个核心问题:
subprocess.check_output默认返回的是字节对象,你直接用for line in ...遍历的话,拿到的是一个个单独的字节,不是完整的目录行,这根本没法正确匹配文件名。ls -l的输出里,文件名本身不会被括号包裹,所以你写的"(myfile.txt)"这个判断条件完全匹配不到内容。
接下来给出修正后的代码示例,分几种场景:
修正方案1:让subprocess返回字符串(推荐Python 3.7+)
用text=True参数让输出直接是字符串,再按行分割遍历:
import subprocess # 使用text=True将输出转为字符串,避免字节处理的麻烦 dir_output = subprocess.check_output(['ls', '-l'], text=True) for line in dir_output.splitlines(): # 直接匹配文件名,去掉多余的括号 if 'myfile.txt' in line: print("File Found") break # 找到后提前退出循环,提高效率
修正方案2:手动解码字节串(适配旧Python版本)
如果你的Python版本低于3.7,就手动把字节串解码成字符串:
import subprocess dir_output = subprocess.check_output(['ls', '-l']) # 将字节串解码为UTF-8格式的字符串 dir_output_str = dir_output.decode('utf-8') for line in dir_output_str.splitlines(): if 'myfile.txt' in line: print("File Found") break
更Pythonic的替代方案:用原生文件系统模块
其实没必要调用ls命令,Python自带的模块更跨平台、更可靠:
用os.listdir遍历:
import os # 遍历当前目录下的所有文件/文件夹 for filename in os.listdir('.'): if filename == 'myfile.txt': print("File Found") break
用pathlib(现代推荐方式,Python 3.4+):
from pathlib import Path current_dir = Path('.') # 直接检查文件是否存在 if current_dir.exists('myfile.txt'): print("File Found") # 或者遍历目录逐个检查 for item in current_dir.iterdir(): if item.name == 'myfile.txt': print("File Found") break
内容的提问来源于stack exchange,提问作者fightstarr20
相关产品推荐
相关产品推荐

