如何创建将搜索所有文本和日志文件的变量

时间:2011-07-14 18:56:57

标签: python

有人可以告诉我为什么我的变量只返回所有.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()

4 个答案:

答案 0 :(得分:3)

  

但是,此行仅搜索.log文件:

不,它不会搜索.txt文件。 :-)原因是(('"*.txt" ') or ('"*.log" '))评估为'"*.txt"

这也有一个(有些参与)原因:or运算符采用两个布尔(true / false)对象的逻辑or。由于它们不是布尔对象而是字符串,因此会检查它们的“真实性”。对于字符串,如果它们中包含任何字符,则认为它们是True。你的两个字符串都是“真实的”。

由于short-circuiting,如果第一个操作数是真值,则不评估or的第二个操作数(因为True or任何事情都是真的,所以没有意义)。最后,or始终返回它评估的最后一个参数,因此在这种情况下,您将获得第一个字符串:'"*.txt"'

你的错误观点是,你认为Python会等待评估or,直到你用它来搜索文件名。它没有。当您分配给apattern时,您给出的表达式已完全评估,并且它将评估为单个字符串'"*.txt"'

有几种方法可以做你想做的事:

  1. 如果您的搜索方法允许,您可以使用一个匹配两个扩展的模式,例如用于UNIX shell的marc '"*.{txt,log}"'
  2. 您可以让Python获取所有文件的名称,并自己检查每个文件是否与模式匹配,如果是,则进行处理。这是g.d.d.c建议的方法。
  3. 您可以进行两次搜索并合并结果。如果可能存在重复项(在这种情况下不存在)并且您不关心文件名的顺序,则可以使用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)。