如何在Python中用标准IO编写并打印文件?

如何在Python中用标准IO编写并打印文件?,python,file-handling,Python,File Handling,我是Python的新手,开始编写脚本,帮助我完成日常工作。最近,我编写了一个SSH脚本,它将登录到服务器并检查与远程应用程序的连接,如果成功,则打印 我能够实现它,但在标准IO上看不到文件(我正在写入)的完整打印。任何人都可以看看我的代码,并建议一种方法应该如何做 我的代码输出:- 您正在分配sys.stdout=f,这意味着以后所有到stdout的打印都将以f结束。我真的很困惑,为什么要让本地stdout进入一个文件,然后尝试从中读取——stdout通常更像是一个程序的“只写”流 我想您可能想

我是Python的新手,开始编写脚本,帮助我完成日常工作。最近,我编写了一个SSH脚本,它将登录到服务器并检查与远程应用程序的连接,如果成功,则打印

我能够实现它,但在标准IO上看不到文件(我正在写入)的完整打印。任何人都可以看看我的代码,并建议一种方法应该如何做

我的代码输出:-
您正在分配
sys.stdout=f
,这意味着以后所有到
stdout
的打印都将以
f
结束。我真的很困惑,为什么要让本地stdout进入一个文件,然后尝试从中读取——stdout通常更像是一个程序的“只写”流

我想您可能想再次检查您的逻辑,但一旦您对sys.stdout进行赋值,所有
print
语句的输出都将转到这里

假设结果不是太大,并且您有足够的内存,您可以执行以下操作:

ssh.connect('xx.xxx.xxx.xx', username= 'xxxxxx', password= 'xxxxx', port=22)
stdin, stdout, stderr = ssh.exec_command('wget -O- http://xx.xxx.xxx.xxx:7777 | grep "HTML"') #some application IP
f = open('out.txt', 'w+',100)
result = stdout.read()
f.write( result )
if 'HTML' in result:
    print "Site is up"
else:
    print "Site is down"
output = os.system ("type c:\python27\out.txt")
print output
f.close()
这将把结果读入一个变量,将其打印到一个文件中,并在其中搜索HTML关键字。在我的方法中,只需打印
结果
即可跳过
os.system
部分,如

ssh.connect('xx.xxx.xxx.xx', username= 'xxxxxx', password= 'xxxxx', port=22)
stdin, stdout, stderr = ssh.exec_command('wget -O- http://xx.xxx.xxx.xxx:7777 | grep "HTML"') #some application IP
f = open('out.txt', 'w+',100)
result = stdout.read()
f.write( result )
if 'HTML' in result:
    print "Site is up"
else:
    print "Site is down"
print result
实际上,您可以将其简化一点,因为您已经在使用
grep
来查看结果中是否包含HTML,您不必对其进行测试,您只需查看是否返回了任何内容,如:

ssh.connect('xx.xxx.xxx.xx', username= 'xxxxxx', password= 'xxxxx', port=22)
stdin, stdout, stderr = ssh.exec_command('wget -O- http://xx.xxx.xxx.xxx:7777 | grep "HTML"') #some application IP
f = open('out.txt', 'w+',100)
result = stdout.read()
f.write( result )
if result:
    print "Site is up"
else:
    print "Site is down"
print result
如果您确实希望输出文件包含一个python字符串列表,您可以这样做:

ssh.connect('xx.xxx.xxx.xx', username= 'xxxxxx', password= 'xxxxx', port=22)
stdin, stdout, stderr = ssh.exec_command('wget -O- http://xx.xxx.xxx.xxx:7777 | grep "HTML"') #some application IP
f = open('out.txt', 'w+',100)
result = stdout.readlines()
f.write(str(result))
if result:
    print "Site is up"
else:
    print "Site is down"
print result

您正在分配
sys.stdout=f
,这意味着以后所有到
stdout
的打印都将以
f
结束。我真的很困惑,为什么要让本地stdout进入一个文件,然后尝试从中读取——stdout通常更像是一个程序的“只写”流

我想您可能想再次检查您的逻辑,但一旦您对sys.stdout进行赋值,所有
print
语句的输出都将转到这里

假设结果不是太大,并且您有足够的内存,您可以执行以下操作:

ssh.connect('xx.xxx.xxx.xx', username= 'xxxxxx', password= 'xxxxx', port=22)
stdin, stdout, stderr = ssh.exec_command('wget -O- http://xx.xxx.xxx.xxx:7777 | grep "HTML"') #some application IP
f = open('out.txt', 'w+',100)
result = stdout.read()
f.write( result )
if 'HTML' in result:
    print "Site is up"
else:
    print "Site is down"
output = os.system ("type c:\python27\out.txt")
print output
f.close()
这将把结果读入一个变量,将其打印到一个文件中,并在其中搜索HTML关键字。在我的方法中,只需打印
结果
即可跳过
os.system
部分,如

ssh.connect('xx.xxx.xxx.xx', username= 'xxxxxx', password= 'xxxxx', port=22)
stdin, stdout, stderr = ssh.exec_command('wget -O- http://xx.xxx.xxx.xxx:7777 | grep "HTML"') #some application IP
f = open('out.txt', 'w+',100)
result = stdout.read()
f.write( result )
if 'HTML' in result:
    print "Site is up"
else:
    print "Site is down"
print result
实际上,您可以将其简化一点,因为您已经在使用
grep
来查看结果中是否包含HTML,您不必对其进行测试,您只需查看是否返回了任何内容,如:

ssh.connect('xx.xxx.xxx.xx', username= 'xxxxxx', password= 'xxxxx', port=22)
stdin, stdout, stderr = ssh.exec_command('wget -O- http://xx.xxx.xxx.xxx:7777 | grep "HTML"') #some application IP
f = open('out.txt', 'w+',100)
result = stdout.read()
f.write( result )
if result:
    print "Site is up"
else:
    print "Site is down"
print result
如果您确实希望输出文件包含一个python字符串列表,您可以这样做:

ssh.connect('xx.xxx.xxx.xx', username= 'xxxxxx', password= 'xxxxx', port=22)
stdin, stdout, stderr = ssh.exec_command('wget -O- http://xx.xxx.xxx.xxx:7777 | grep "HTML"') #some application IP
f = open('out.txt', 'w+',100)
result = stdout.readlines()
f.write(str(result))
if result:
    print "Site is up"
else:
    print "Site is down"
print result

您打开了文件,但没有尝试写入,因此是一个空文件。这是使用urllib的HTTP请求进行的简单复制,但在其他方面,文件I/O部分是相同的:

import urllib.request

# return a http.Request object
response = urllib.request.urlopen('http://google.com')                                                                           

# open the file for both reading and writing                                                                                                         
with open('out.txt', 'w+') as f:                                                                                       
    f.write(str(response.read())) 

    if 'HTML' in f.read():                                                                                                       
        print("Site is up")                                                                                                      
    else:                                                                                                                        
        print("Site is down") 

另外,通过使用
上下文管理器来打开一个文件,您不必担心以后会关闭该文件。

您打开了该文件,但没有尝试写入,因此是一个空文件。这是使用urllib的HTTP请求进行的简单复制,但在其他方面,文件I/O部分是相同的:

import urllib.request

# return a http.Request object
response = urllib.request.urlopen('http://google.com')                                                                           

# open the file for both reading and writing                                                                                                         
with open('out.txt', 'w+') as f:                                                                                       
    f.write(str(response.read())) 

    if 'HTML' in f.read():                                                                                                       
        print("Site is up")                                                                                                      
    else:                                                                                                                        
        print("Site is down") 

另外,通过使用
上下文管理器打开文件,您不必担心以后会关闭文件。

什么意思?在我的代码中,我在标准IO上看不到文件的完整打印?@AnandSKumar,我正在尝试读取WGET响应,然后根据IF/ELSE条件决定是否写入“站点已启动”或“站点已关闭”。现在,我没有看到写入out.txt文件的打印“Site is up”。你是什么意思?我在标准IO上看不到文件(我正在写入)的完整打印?@AnandSKumar-在我的代码中,我试图读取WGET响应,然后根据IF/ELSE条件决定是否写入“Site is up”或“Site is down”.现在,我没有看到会写入我的out.txt文件的打印“站点已启动”。谢谢你的建议。但是,如果我打印标准输出并尝试使用if/ELSE条件,那么它不会给出正确的结果。代码:用于stdout.readlines()中的行:print line.strip()stdin,stdout,stderr=ssh.exec_命令('wget-O-xx.xx.xx.xx:7777 | grep“HTML”):如果stdout.readlines()中的“HTML”为“HTML”,则打印stdout.readlines():print“Site is up”否则:print“Site is down”ssh.close()输出:---------------['\n']站点关闭-----------------代码无法根据标准输出做出决定,它错误地显示“站点关闭”。请注意,我没有在我的中使用readlines,我使用read将整个内容作为字符串返回。除非您确实想要/需要一个包含
HTML
作为字符串的行列表,否则您不需要将其作为字符串list@sama我有一个版本应该也适用于
readlines
,如果您真的想要将python列表写入文件,非常感谢您的输入。这两个建议对我都有效。谢谢你的建议。但是,如果我打印标准输出并尝试使用if/ELSE条件,那么它不会给出正确的结果。代码:用于stdout.readlines()中的行:print line.strip()stdin,stdout,stderr=ssh.exec_命令('wget-O-xx.xx.xx.xx:7777 | grep“HTML”):如果stdout.readlines()中的“HTML”为“HTML”,则打印stdout.readlines():print“Site is up”否则:print“Site is down”ssh.close()输出:---------------['\n']站点关闭-----------------代码无法根据标准输出做出决定,它错误地显示“站点关闭”。请注意,我没有在我的中使用readlines,我使用read将整个内容作为字符串返回。除非您确实想要/需要一个包含
HTML
作为字符串的行列表,否则您不需要将其作为字符串list@sama我有一个版本应该