如何在python中比较两个文件并获取布尔值?

时间:2015-06-03 05:29:48

标签: python

我是python中的新手我正在处理python文件操作,其中我有两个输入文件

1.Security_Headers_list.txt

9508,content-security-policy
9496,content-security-policy
9240,content-security-policy
904,content-security-policy,x-content-type-options,strict-transport-security,x-frame-options
8013,content-security-policy
5263,content-security-policy,x-frame-options
4378,content-security-policy
3854,content-security-policy
3331,content-security-policy

2.Master.txt

strict-transport-security
content-security-policy
x-frame-options
x-content-type-options
x-xss-protection
public-key-pins

必须将安全标题列表与主列表进行比较。

脚本:

    f_out=open('Output.txt', 'wb')
    f=open('master.txt','r')
    a=f.readlines()
    f1=open("Security_Headers_list.txt","r")
    b=f1.readlines()
    x=0
    str=""
    match =[]
    appno =""
    while x<len(a):
            h=a[x].strip()
            y=0
            z=0
            while y<len(b):
                    c=b[y].strip()
                    appno=b[0]
                    if (h==c):
                            z=1
                    y=y+1
            if z == 1:
                    str=str+"Yes,"
            else:
                    str=str+"No, "
            x=x+1
    match.insert(0,appno)
    f_out.write(b[0].rstrip() + "," + str[0:len(str)-2])
    f.close()
    f1.close()
    f_out.close()

输出必须如下:

9508,No,Yes,No,No,No,No
9496,No,Yes,No,No,No,No
9240,No,Yes,No,No,No,No
904,Yes,Yes,Yes,Yes,No,No
8013,No,Yes,No,No,No,No
5263,No,Yes,Yes,No,No,No
4378,No,Yes,No,No,No,No
3854,No,Yes,No,No,No,No
3331,No,Yes,No,No,No,No

我没有得到我想要的东西,请给我一些建议。

4 个答案:

答案 0 :(得分:1)

由于您有2个文件,因此您需要从一个文件中提取数据,请创建该数据的列表,该列表表示类型types = data1.read().split("\n")。然后迭代第一个文件中的每一行,查看其中是否存在类型,并相应地替换"Yes""No"值。

with open("Master.txt", "r") as data1, open("Security_Headers_list.txt", "r") as data2:
  types = data1.read().split("\n")
  for line in data2:
    out = ""
    split_line = line.strip().split(",")
    sno, categories = split_line[0], split_line[1:]
    out+=sno+"  "
    for typ in types:
      if typ in categories:
        out+="Yes, "
      else:
        out+="No, "
    print out[:-2]

输出:

9508  No, Yes, No, No, No, No
9496  No, Yes, No, No, No, No
9240  No, Yes, No, No, No, No
904  Yes, Yes, Yes, Yes, No, No
8013  No, Yes, No, No, No, No
5263  No, Yes, Yes, No, No, No
4378  No, Yes, No, No, No, No
3854  No, Yes, No, No, No, No
3331  No, Yes, No, No, No, No

修改

在评论和列表理解的@AntonyHatchkins的帮助下,上面的代码可以简化为:

with open("TEKST_ny.txt", "r") as data1, open("sample.txt", "r") as data2:
  types = data1.read().split("\n")
  for line in data2:
    sno, categories = line.rstrip().split(',', 1)
    print "".join([sno+"  "]+["Yes, " if typ in categories else "No, " for typ in types ])[:-2]

答案 1 :(得分:1)

我建议使用比@ZdaR(+一个生成器表达式)略有不同的连接:

with open("Master.txt", "r") as data1:
    master = data1.read().rstrip().split("\n")
with open("Security_Headers_list.txt", "r") as data2:
    for line in data2:
        num, cat = line.rstrip().split(",", 1)
        print num + '  ' + ', '.join('Yes' if t in cat else 'No' for t in master)

答案 2 :(得分:0)

试试这段代码:

f_out=open('Output.txt', 'wb')
f=open('master.txt','r')
a=f.readlines()
f1=open("Security_Headers_list.txt","r")
b=f1.readlines()
x=0
str=""
match =[]
for line in b:
    options = line.split(",")
    l = options[0]
    options1 =[]
    for opt in options:
        options1.append(opt.strip())
    for match in a:
        if match.strip() in options1:
            l = l + ",Yes"
        else:
            #print match.strip()
            l = l + ",No"
    f_out.write(l+"\n")
f.close()
f1.close()
f_out.close()

答案 3 :(得分:-1)

您可以使用'filecmp'模块比较两个文件,它将返回boolen值,true或false。它具有简单的语法。这是帮助你的链接。 https://docs.python.org/2/library/filecmp.html