有人可以告诉我为什么我的变量只返回所有.txt文件或所有.log文件,但不能同时返回两者。我以为我理解这一点,因为我之前使用过类似的if语句和qn结束了文本或日志扩展的方法。但是,从服务器获取文件只允许我获取一个或另一个。我确定这是语法......我对Python的经验很少。任何帮助表示赞赏:
此行正常或.txt:
的变体 apattern = '"*.log"'
但是,此行仅搜索.log文件:
apattern = (('"*.txt" ') or ('"*.log" '))
代码:
import paramiko
import sys
import os
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('10.5.48.72', username='root', password='*****')
apath = '/'
apattern = '"*.{txt,log}"' #(('"*.txt" ') and ('"*.log" '))
rawcommand = 'find {path} -name {pattern}'
command = rawcommand.format(path=apath, pattern=apattern)
stdin, stdout, stderr = ssh.exec_command(command)
filelist = stdout.read().splitlines()
ftp = ssh.open_sftp()
for afile in filelist:
(head, filename) = os.path.split(afile)
print(filename)
ftp.get(afile, 'c:\\ANewOne\\' + filename) #'./'+filename)
ftp.close()
ssh.close()
答案 0 :(得分:3)
但是,此行仅搜索.log文件:
不,它不会搜索.txt文件。 :-)原因是(('"*.txt" ') or ('"*.log" '))
评估为'"*.txt"
。
这也有一个(有些参与)原因:or
运算符采用两个布尔(true / false)对象的逻辑or
。由于它们不是布尔对象而是字符串,因此会检查它们的“真实性”。对于字符串,如果它们中包含任何字符,则认为它们是True
。你的两个字符串都是“真实的”。
由于short-circuiting,如果第一个操作数是真值,则不评估or
的第二个操作数(因为True or
任何事情都是真的,所以没有意义)。最后,or
始终返回它评估的最后一个参数,因此在这种情况下,您将获得第一个字符串:'"*.txt"'
。
你的错误观点是,你认为Python会等待评估or
,直到你用它来搜索文件名。它没有。当您分配给apattern
时,您给出的表达式已完全评估,并且它将评估为单个字符串'"*.txt"'
。
有几种方法可以做你想做的事:
'"*.{txt,log}"'
。set
删除欺骗:filenames = set(list1 + list2)
。< / LI>
醇>
答案 1 :(得分:2)
apattern = '"*.{txt,log}"'
应该使用unix样式的shell扩展来组合扩展。
find
实用程序的另一个变体是
apattern = '"*.txt" -o -name "*.log"'
也许你也可以试试这个。这将构造命令
find {path} -name "*.txt" -o -name "*.log"
答案 2 :(得分:0)
在Python中,在进行分配时,使用或没有多大意义因为你的第一个条件是“True-ish”(它不是一个空字符串),所以该分配的后半部分不会被评估。如果你有某个文件名,你可以这样做:
if filename.endswith('txt') or filename.endswith('log')
但更好的方法是使用这样的东西:
ext = os.path.splitext(filename)[-1]
if ext in ('txt', 'log'):
# some other processing here.
答案 3 :(得分:0)
or的第一部分或者计算结果为True,因此它不会执行第二部分(* .txt)。