2014-06-25 24 views
0

当前该程序找到所有包含您要求它查找的特定单词的行,但是如何更改它以便将所有多行号存储为不同的值,即I然后可以操作。或者如何找到该短语的具体发生。根据用户输入查找文件中的一行

a = raw_input("Please enter something: ") 
lookup = a 
with open('FileName') as myFile: 
    for num, line in enumerate(myFile, 1): 
     if lookup in line: 
      print 'found at line:', num 
+0

我怎样才能得到一个特定的事件行号?因为目前它会打印出特定短语的所有行号,但我只想获得第三次出现。 – Nick

回答

1

而不是打印num,你可以将它存储到一个列表(或两者兼有)。

found = [] 
for num, line in enumerate(myFile, 1): 
    if lookup in line: 
     print 'found at line:', num 
     found.append(num) 
     # found.append((line,num)) # use this if you want to store both the line and the number 

的这个简短的版本是:

found = [num for num, line in enumerate(myFile, 1) if lookup in line] 

短版与num印刷:

found = [num for num, line in enumerate(myFile, 1) if lookup in line and not print(num)] 

这会给你一个列表found存储所有nums针对你的查找成功了。

+0

或更低的可读性:'如果在行中查找,'enumerate(myFile,1)'中找到= [(num,line)]' –

+0

我会如何将每个行号保存为一个单独的变量? – Nick

+0

@Nick您可以通过索引到“找到”来访问这些值,例如, 'found [0]'是查找成功的第一行的'num','找到[1]'是第二行的'num',依此类推。你在问什么? – timgeb

0
lookup = raw_input("Please enter something: ") 
with open("FileName") as myfile: 
    found = {num: line for (num, line) in enumerate(myfile, 1)} 

这就是我该怎么做的。该字典比较是有点简洁,而且阐述了它的作用:

found = {} # empty dict 
for num, line in enumerate(myfile, 1): 
    found[num] = line 

这将让你与字典玩像这样:

for lineno, line in found.items(): 
    print "{:03}: {}".format(lineno, line) 

编辑为您的问题评论意见

我个人会使用正则表达式,而不是试图将它拼凑在一起。然而,为了回答你的问题:

startsentry="DATA STARTS ON THE NEXT LINE" 
endsentry="DATA ENDS ON THE PREVIOUS LINE" 

with open('path/to/file') as myfile: 
    for line_num, line in enumerate(myfile, 1): 
     if startsentry in line: 
      _start = line_num+1 
     if endsentry in line: 
      _end = line_num 
    data_is_in = (_start, _end) 
+0

有没有办法找到使用关键字行,然后打印所有的东西,直到我击中另一个关键字的东西? – Nick

+0

@Nick编辑.... –

+0

我发现了一个非常简单的方法来做到这一点:对于我列举的行(打开(“FILE”)): 如果i> = 95且i <97: \t print line,如果i> = 133且i <134: 打印行, 对于i,行中列举(打开(“FILE”)): 如果i > = 196和i <2197: print line, for i,line in enumerate(open(“FILE”)): if i> = 2225 and i <4227: print line, 现在我只需要做是能够得到行号我变得超级卡住:( – Nick

0

我建议了不同的方法,像:

lines = [] 
with open("file") as f: 
    lines = f.readlines() 

phrases = filter(lambda x: "foo" in x[1], enumerate(lines)) 
print phrases 

现在你留下了行号和短语对匹配“foo”的数组。

更新:更改为枚举每个评论(谢谢!)。

+0

记住你的'枚举'内建! 'line = enumerate(f)'与你的'lines = f.readlines();是一样的。 lines = zip(...)'除了少得多的内存密集:) –

相关问题