我是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
我没有得到我想要的东西,请给我一些建议。
答案 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