2012-08-30 92 views
0

我想要做的是从一个文件读取一行到一个字符串,然后在另一个文件中搜索包含该字符串的行并用.split()解析该行。使用python中另一个文件的输入搜索文件

我的代码如下所示:

for line in portslist: 
    marker = line.split() 
    printername = marker[0] 
    address = marker[1] 

    for lines in constantfile: 
     if address in line: #if the desired address is in the line 
      lineholder = line 
      lineholder = lineholder.split() 
      oldonline = lineholder[4] 
      oldutc = lineholder[5] 
      status = lineholder[2] 

但是,我得到的错误

in readermain oldonline=lineholder[4] IndexError: list index out of range 

一些故障排除,似乎从我的constantfile行永远不会被分配到行之后。相反,它似乎来自文件portlist的行被分配给行,该行只有两个索引。

我的问题是如何使字符串"address"被分配到行中,以便我可以解析和使用它?

+1

您的缩进不正确 - Python文件甚至无法运行。你能检查并修复它吗? –

+0

另外,究竟是'portslist'和'constantfile'? –

+0

对于缩进,感到抱歉。它没有正确复制。但是,在我的实际代码中是正确的。至于portslist和constantfile,它们都是在代码中的其他地方打开的文件。 – user1637108

回答

3

我认为你正在使用line,你应该使用lines

for lines in constantfile: 
    if address in lines: #if the desired address is in the line 
     lineholder=lines.split() 
     # etc. 

而且,如果constantfile是一个文件对象,这个迭代将外for循环的第一遍后耗尽。

+0

'constantfile'确实是一个文件对象。我将如何避免第一遍之后外迭代器耗尽?这是我的第一个真正的Python程序,所以任何帮助,非常感谢。 – user1637108

+0

你可以将它们都读入列表中;那么你可以经常迭代它们:'constantfile = open(filename).readlines()'等等 –

+0

所以我把'line'改成'lines'并且把'constantfile'和'portslist'变成了列表使用你的建议。我现在的问题是它只是一遍又一遍地读取constantfile的第一行。我很确定这仍然与迭代有关系吗? – user1637108

0

您的缩进使得它即使“地址在线”评估为false,块的其余部分也会运行。

其次,来自constantfile的行应该分配给变量“行”。将相应的代码改为

if address in lines: 
    lineholder = lines 
    ... 

你应该很好。此外,我会建议一个不太随意的命名约定,使其明确表示您正在处理来自2个不同文件的行。例如

  • 线 - > portline
  • 标记 - > portlinesplit
  • 线 - > constline
  • lineholder - > constlinesplit

这样,它会少些混乱,你的代码会更具可读性。

相关问题