首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python迭代并写入文件

python迭代并写入文件
EN

Stack Overflow用户
提问于 2016-02-25 04:00:15
回答 2查看 69关注 0票数 1

我需要编写一个打开两个文件的函数,如果某个比较为真,将结果写入第三个文件:

代码语言:javascript
复制
def crack_pass_file(pass_filename,words_filename,out_filename):
    f1=open(pass_filename)
    f2=open(words_filename)
    f3=open(out_filename,'w')
    for line1 in f1:
        x=make_dictionary(line1.split(":"))
        password=x["password"]
        name=x["account"]
        for line2 in f2:
            if (check_pass(line2.strip(),password)==True):
                f3.write(name + "="+line2.strip())

文件f1是一个文件,包含:

代码语言:javascript
复制
root:VgzdTLne0kfs6:0:0:Corema Latterll:/home/root:/bin/bash
checani:IqAFDoIjL2cDs:1:1:Pengpu Checani:/home/checani:/bin/bash
rkrakow:DLD3nJmCvt3pY:2:2:Rodentia Krakow:/home/rkrakow:/bin/bash
forkland:oWMVyy1FTdNL6:3:3:Forkland Maskins:/home/forkland:/bin/bash
obongo:O44lPEloqk5tY:4:4:Obongo Obwalden:/home/obongo:/bin/bash
pglenda:xboW5dHcsqvSQ:5:5:Pahsien Glenda:/home/pglenda:/bin/bash
madel:qEHvJXMkTSAZA:6:6:Madel Aporosa:/home/madel:/bin/bash
ssauks:Q3Kz1z7eAiwjg:7:7:Schober Sauks:/home/ssauks:/bin/bash
slajoie:wWTHgoE8SC8W6:8:8:Scheiner Lajoie:/home/slajoie:/bin/bash
tieton:RWORYLxRSSzMU:9:9:Lerwa Tieton:/home/tieton:/bin/bash

其中每一行都有一个用户、一个密码和一堆其他东西。对于第1行,root是用户,VgzdTLne0kfs6是加密的密码。每一行都使用相同的格式。我需要做的是获取加密的密码,并查看是否对另一个文件f2中的密码调用密码,该文件包含一个按字母顺序排列的巨大单词列表,如:

代码语言:javascript
复制
embordering
emborders
emboscata
embosk
embosked
embosking

会把那个密码变成加密的密码。我已经有了这样做的功能,它起作用了:

代码语言:javascript
复制
def check_pass(plain,enc):
    s = enc[0:2]
    x = crypt.crypt(plain, s)
    if x==enc: return True
    else: return False

这里还有一个生成函数,我用它从文件1的每一行中制作字典,我也测试过它:

代码语言:javascript
复制
def make_dictionary(s):
    d={}
    d["account"]=s[0]
    d["shell"]=s[6]
    d["UID"]=int(s[2])
    d["GID"]=int(s[3])
    d["GECOS"]=s[4]
    d["directory"]=s[5]
    d["password"]=s[1]
    return d

当我测试它时,它会将: root=stroam写到输出文件中,这是第一个用户的解密密码,但是没有写任何其他的密码。这应该是结果:

代码语言:javascript
复制
root=stroam
checani=asarta
rkrakow=sinklike
obongo=yawnful
madel=aviatic
tieton=dagesh
pglenda=sngissa
forkland=relliarb
slajoie=mu2j1k
ssauks=EGaFeIHC

我在单词文件中找到了所有这些单词(打哈欠,无敌,等等),但由于某种原因,它们并不匹配。我也尝试过做类似的事情:check_pass(“As战”,"IqAFDoIjL2cDs")和其他一些,它们都返回true,所以我很困惑为什么更多的它们没有打印到我的输出文件。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-25 04:04:55

您希望计算f1中的每一行与f2中的每一行。但是,在通过f2进行的第一次迭代中,您使用了f1中的每一行。在第二次迭代中,f2是空的,您不会进入这个循环的主体。

代码语言:javascript
复制
for line1 in f1:
# ...
    for line2 in f2:

相反,在for line in f1循环之外,生成f2 (以及可选的f1)中的行列表,如下所示:

代码语言:javascript
复制
f2_lines = [line2 for line2 in f2]
...
for line1 in f1:

现在你可以用

代码语言:javascript
复制
for line2 in f2_lines:

f1循环的主体中。

票数 0
EN

Stack Overflow用户

发布于 2016-02-25 04:06:02

当您第一次迭代f2时,您就耗尽了迭代器,而f2的所有未来迭代都是根本不执行的循环。要么将f2的所有行加载到list中以便可以多次迭代,要么在耗尽它之后调用f2.seek(0)来重置文件指针。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35618029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档