使用Python比较目录和文本文件

使用Python比较目录和文本文件,python,linux,bash,shell,Python,Linux,Bash,Shell,我的目标是比较两个数据,一个来自文本文件,一个来自目录,比较后,这将通知或在控制台中显示未找到的数据,例如: ls: /var/patchbundle/rpms/:squid-2.6.STABLE21-7.el5_10.x86_64.rpm NOT FOUND! ls: /var/patchbundle/rpms/:tzdata-2014j-1.el5.x86_64.rpm ls: /var/patchbundle/rpms/:tzdata-java-2014j-1.el5.x86_64.rp

我的目标是比较两个数据,一个来自文本文件,一个来自目录,比较后,这将通知或在控制台中显示未找到的数据,例如:

ls: /var/patchbundle/rpms/:squid-2.6.STABLE21-7.el5_10.x86_64.rpm NOT FOUND!
ls: /var/patchbundle/rpms/:tzdata-2014j-1.el5.x86_64.rpm 
ls: /var/patchbundle/rpms/:tzdata-java-2014j-1.el5.x86_64.rpm 
ls: /var/patchbundle/rpms/:wireshark-1.0.15-7.el5_11.x86_64.rpm
ls: /var/patchbundle/rpms/:wireshark-gnome-1.0.15-7.el5_11.x86_64.rpm 
ls: /var/patchbundle/rpms/:yum-updatesd-0.9-6.el5_10.noarch.rpm NOT FOUND
一定是这样。这是我的python代码

import package, sys, os, subprocess

path = '/var/tools/tools/newrpms.txt'

newrpms = open(path, "r")
fds = newrpms.readline()
def checkrc(rc):
            if(rc != 0):
                    sys.exit(rc)
cmd = package.Errata()
for i in newrpms:
    rc = cmd.execute("ls /var/patchbundle/rpms/ | grep %newrpms ")
        if ( != 0):
                    cmd.logprint ("%s not found !" % i)
checkrc(rc)
sys.exit(0)
newrpms.close
请参阅shell脚本。这个脚本是它的执行文件,但因为我想使用另一种语言,所以我尝试使用python

retval=0
for i in $(cat /var/tools/tools/newrpms.txt)
do
        ls /var/patchbundle/rpms/ | grep $i
        if [ $? != 0 ]
        then
                echo "$i NOT FOUND!"
                retval=255
        fi
done
exit $retval

请看我的Python代码。什么是错误的,因为它不像shell那样执行它。

您没有说“newrpms.txt”的内容是什么;你说脚本没有按你想要的方式执行,但你没有说它在做什么;我不知道
package
package.Errata
是什么,所以我在玩猜问题的游戏;但很多事情都是错的

  • 如果(!=0):
    是语法错误。如果{empty space}不等于零

  • cmd.execute(“ls/var/patchbundle/rpms/| grep%newrpms”)
    可能没有执行您想要的操作。在Python中不能像这样将变量放入字符串中,如果可以的话,
    newrpms
    是文件句柄,而不是当前行。那应该是
    …grep%s“%(i,)

  • 控制流正在执行以下操作:

  • 查看此文件夹,尝试查找文件
  • 调用checkrc()
  • 只有在找不到最后一个文件时,才会因错误而退出
  • newrpms.close
    没有执行任何操作,需要
    newrpms.close()
    才能调用close方法

  • 您正在用Python编写shell脚本。如何:

    import os, sys
    
    retval=0
    
    for line in open('/var/tools/tools/newrpms.txt'):
        rpm_path = '/var/patchbundle/rpms/' + line.strip()
        if not os.path.exists(rpm_path):
            print rpm_path, "NOT FOUND"
            retval = 255
        else:
            print rpm_path
    
    sys.exit(retval)
    
    略加编辑代码,并给出解释:

    该代码几乎是将shell脚本直接复制到Python中。它在文本文件中的每一行上循环,并调用
    line.strip()
    ,以去除结尾的换行符。它构建
    rpm\u路径
    ,类似于“/var/patchbundle/rpms/:tzdata-2014j-1.el5.x86\u 64.rpm”


    然后它使用
    sys.path.exists()
    测试文件是否存在,如果存在则返回True,如果不存在则返回False,并使用该测试设置错误值并像shell脚本打印结果一样打印结果。这将替换“ls…”grep“检查文件是否存在的代码的一部分。

    谢谢您的回答,先生,现在它有意义了。但我只是想问一个问题。如果没有os.path.exists('/var/patchbundle/rpms/'+rpm.strip()),这一行
    是什么
    means?@akimebless:为了更清楚,我稍微修改了代码,并在我的回答中添加了对您的问题的解释。谢谢您,先生,为这一点付出了努力,我会试试这个。