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

时间:2014-11-27 04:48:06

标签: 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.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一样执行。

1 个答案:

答案 0 :(得分:1)

你不能说出" newrpms.txt"的内容。是;你说剧本没有按照你想要的方式执行 - 但你不能说它在做什么;我不知道packagepackage.Errata是什么,所以我在猜这个问题;但很多事情都是错的。

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

  2. cmd.execute("ls /var/patchbundle/rpms/ | grep %newrpms ")可能没有做你想要的。你不能像Python一样把变量放在Python的字符串中,如果你能newrpms是文件句柄而不是当前行。那应该是...grep %s" % (i,))

  3. 控制流程正在执行:

    1. 查看此文件夹,尝试查找文件
    2. 致电checkrc()
    3. 如果找不到最后一个文件,则仅退出并显示错误
  4. newrpms.close没有做任何事情,需要newrpms.close()来调用close方法。

  5. 您正在编写shell-script-in-Python。怎么样:

    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_path,类似于" / var / patchbundle / rpms /:tzdata-2014j-1.el5.x86_64.rpm"。

    然后它使用sys.path.exists()测试文件是否存在,如果不存在则返回True,如果不存在则返回False,并使用该测试设置错误值并打印结果,如shell脚本打印它们。这取代了" ls ... | grep"用于检查文件是否存在的部分代码。