我试图逐行打印列表中的每个文件。 在文件的每一行的末尾,它需要检查术语“ .sh”是否在其中。
我遇到错误
“尾巴:写入错误:“管道破损”
预期结果:
这是我的atm:
# Modules
import os
from pprint import pprint
# Files in list
dirlist = ['test.txt','test2.txt','test3.txt']
# Loop to read the file in list
for x in range (len(dirlist)):
print ("Output of Filename: " + dirlist[x]
# Variable to save the last 3 characters of the line
last3 = os.popen ("cat " + dirlist[x] + " | tail -c 3")
print last3
# Read file
f = open(dirlist[x], "r")
# Loop to check if the keyword is the same as last3
for l in f:
if last3 in l:
print ("FOUND IT!")
else:
print ("NOT IN IT!")
[![在此处输入图片描述] [3]] [3]
答案 0 :(得分:2)
我建议您将环境与本机python代码一起使用,而不要使用open和os.popen
这是一个例子
# Files in list
dirlist = ['test.txt','test2.txt','test3.txt']
# Loop to read the file in list
for x in dirlist:
print ("Output of Filename: " + x)
with open(x) as f
lines=f.readlines()
for line in lines: #here you print each line
print (line)
if '.sh' in lines[-1:]: #check if .sh is in the last line
print("found it")
else:
print("didnt find it")
答案 1 :(得分:1)
os.popen
返回文件对象,而不是字符串。
请参阅:Assign output of os.system to a variable and prevent it from being displayed on the screen
答案 2 :(得分:1)
tail
(实际上是stdio)在尝试写入输出时出现“断管”错误,但周围没有人可以读取它。 (更具体地说,当它收到SIGPIPE
时。)
如果您要使用popen
启动子进程,则需要在程序退出之前完成从管道的读取。
在您的情况下,您应该使用subprocess.run
而不是裸露的os.popen
。
或者更好的是,不要将子进程用于简单的文件操作!只需使用本机Python代码进行处理,就会更加简单。
答案 3 :(得分:-1)
在@Nic Wanavit和Daniel Pyrden的帮助下,我终于修复了它。
我已将 if / else 放入循环内,否则它将检查所有行中的.sh而不是每行。
并且我已经在“。sh” 部分中添加了括号,并且可以正常工作!
但是,我没有在最后3个字符中使用它,因为-1:由于某种原因对我不起作用。
# Files in List
dirlist = ['test.txt', 'test2.txt', 'test3.txt']
# Loop to read the file in list
for x in dirlist:
print ("Output of filename: "+ x)
with open(x) as f:
lines = f.readlines()
for line lines:
print ("Line in file: " + line)
if (".sh" in line):
print ("FOUND IT")
else:
print ("not found it \n")