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

标签 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 那样执行。

最佳答案

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

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

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

  3. 控制流正在做:

    1. 查看这个文件夹,尝试找到文件
    2. 调用 checkrc()
    3. 只有在最后一个文件没有找到时才会报错退出
  4. newrpms.close 没有做任何事情,它需要 newrpms.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() 去除末尾的换行符。它构建了类似于“/var/patchbundle/rpms/:tzdata-2014j-1.el5.x86_64.rpm”的 rpm_path

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

关于python - 使用 Python 比较目录和文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27163252/

相关文章:

python - 在 python 中安装 lxml 模块

linux - find中的/u=s参数是什么意思?

linux - 在 sox 处理后使用大括号扩展在 bash 中为输出文件添加前缀

bash - 变量扩展和命令替换之间的扩展顺序

linux - 将文件夹结构(不含文件)从一个位置复制到另一个位置

bash - 为什么要在 bash 中休眠和等待?

python - 如何使用多重继承来编写 Django 表单?

python - 如何在Python中解析字符串以列出?

python - 如何在没有 Flask 的情况下在 Heroku 上托管 websocket 应用程序 python 服务器?

c++ - 需要当前进程的 PID,getpid() 返回 -1