2016-09-23 136 views
-4

我有两个文本文件“usernames.txt”和“passwords.txt”,我想让它们按照特定的顺序打印出来,我有一段代码完全符合我的需要,但我觉得它可以是缩短。如何减少此代码?

with open('passwords.txt','r') as f: 
    for line in f: 
     for password in line.split(): 
      with open('usernames.txt','r') as f: 
       for line in f: 
        for username in line.split(): 
         print username +":"+ password 

这对我来说很完美,我觉得我可以让它变得更短!

电流输出是这样的:

username1:password 
username1:password1 
username1:password2 
username2:password 
username2:password1 
username2:password2 
+0

显示用于生成样品的输入文件输出。 – John1024

+3

有关改进或维护代码的问题应在[CodeReview](https://codereview.stackexchange.com/)上发布。 –

回答

-1

没有短得多(5比7行),但至少一点更可读的,如果我这样说自己:

passwords = open('passwords.txt').readlines() 
usernames = open('usernames.txt').readlines() 

for p in passwords: 
    for u in usernames: 
     print '%s:%s' % (u.strip(), p.strip()) 

编辑

此答案假定您的passwords.txtusernames.txt每行有一个条目。没有多行条目。

+0

我不认为这是正确的。 OP使用'split()'(返回一个列表)而不是'.strip()'(它返回一个字符串)。 – MSeifert

+0

虽然我的版本的输出与OP的输出相同。没有他的源文件的例子,我只能做出假设。我的假设是,这些文件将包含每行一个条目。 – Jasper

+1

我知道你是一个新成员,所以请看看[如何回答(帮助中心)](http://stackoverflow.com/help/how-to-answer)。我认为一般的指导原则是,如果你不知道OP为什么/在做什么,那么你应该要求澄清(评论),而不是**做出假设。 – MSeifert

3

不要担心它会缩短,通过删除嵌套使其更具可读性。

  1. Open both files in one line
  2. 提取数据与嵌套list comprehension
  3. 使用itertools.product让你的组合

像这样的事情

import itertools 

    with open('passwords.txt', 'r') as pf, open('usernames.txt', 'r') as uf: 
     passwords = [pwd for line in pf for pwd in line.split()] 
     usernames = [uname for line in uf for uname in line.split()] 

    for username, password in itertools.product(usernames, passwords): 
     print("{}: {}".format(username, password) 
+0

使用'itertools.chain.from_iterable(map(operator.methodcaller(“split”),pf))'和'uf'。然后将它用于** with语句中的'itertools.product' **。将会更有效率,并消耗更少的内存。 – Bharel