作为背景,我创建了一个列表,其中包含不同文件名的元素,其完整路径(/.../filea.dat)
名为fileList
,长度可变。它的格式为fileList = ['/../filea.dat', '/../fileb.dat']
。
我想对该文件列表中的每个文件执行一个子进程命令,然后再单独分析每个文件的组件(和生成的新文件)。
for i, elem in enumerate(fileList):
hexed = fileList[i]
subprocess.Popen("hexdump " + hexed + " > hexed.dat", shell=True)
with open("hexed.dat", "r") as f:
for line in f:
if "statement" in line:
value = "examplevalue"
if value == "examplevalue"
other subprocess statements that create a file that will again be used later
现在我有TypeError: cannot concatenate 'str' and 'list' objects
。让我知道我是否也采用这种方法方法走在正确的轨道上。
如果我需要提供额外的说明,请告诉我。我试图简化基础知识,因为其他细节对问题并不重要。
答案 0 :(得分:2)
你很亲密。您遇到类型错误,因为Popen
要求您在传入字符串而不是列表时也设置shell=True
。但是还有另外一个问题:Popen
没有等待进程完成,因此当您阅读文件时,它还没有任何有用的东西。另一种策略是跳过文件重定向并直接读取输出流。另请注意,您不需要使用enumerate
... for循环已获取列表中的值。我们可以跳过shell并将命令作为列表传递。
for hexed in fileList:
proc = subprocess.Popen(["hexdump", hexed], stdout=subprocess.PIPE,
stderr=open(os.devnull, 'w'))
for line in proc.stdout:
if "statement" in line:
value = "examplevalue"
proc.wait()
if proc.returncode != 0:
print('error') # need less lame error handling!
if value == "examplevalue"
other subprocess statements that create a file that will again be