搜索文件并找到完全匹配和打印行?

Rob*_*ots 9 python search file match

我搜索了一下,但我找不到任何帖子来帮助我解决这个问题,我发现类似但我无论如何都找不到任何解决这个问题的事情.

这是我的问题,我正在尝试让python脚本搜索文本文件,文本文件在列表中有数字,每个数字对应一行文本,如果raw_input匹配文本文件中的确切数字它打印整行文本.到目前为止它打印包含该数字的任何行.

问题的例子,用户类型20然后输出是每个东西包含一个2和一个0,所以我得到220 foo 200 bar等.我怎么能解决这个问题,所以它只是找到"20"

这是我的代码

num = raw_input ("Type Number : ")
search = open("file.txt")
for line in search:
 if num in line:
  print line 
Run Code Online (Sandbox Code Playgroud)

谢谢.

The*_*inn 17

构建匹配行的列表 - 几种风格:

def lines_that_equal(line_to_match, fp):
    return [line for line in fp if line == line_to_match]

def lines_that_contain(string, fp):
    return [line for line in fp if string in line]

def lines_that_start_with(string, fp):
    return [line for line in fp if line.startswith(string)]

def lines_that_end_with(string, fp):
    return [line for line in fp if line.endswith(string)]
Run Code Online (Sandbox Code Playgroud)

构建匹配行的生成器(内存效率高):

def generate_lines_that_equal(string, fp):
    for line in fp:
        if line == string:
            yield line
Run Code Online (Sandbox Code Playgroud)

打印所有匹配的行(首先找到所有匹配,然后打印它们):

with open("file.txt", "r") as fp:
    for line in lines_that_equal("my_string", fp):
        print line
Run Code Online (Sandbox Code Playgroud)

打印所有匹配的行(在我们找到它们时懒惰地打印它们)

with open("file.txt", "r") as fp:
    for line in generate_lines_that_equal("my_string", fp):
        print line
Run Code Online (Sandbox Code Playgroud)

生成器(由 yield生成)是您的朋友,尤其是对于不适合内存的大文件。


unu*_*tbu 10

要检查您将使用的完全匹配num == line.但是line有一个行尾字符,\n或者因为删除尾随换行符\r\n而不会出现这种情况.因此,它可以很方便在年底移除所有的空格与numraw_inputline

line = line.rstrip()
Run Code Online (Sandbox Code Playgroud)
with open("file.txt") as search:
    for line in search:
        line = line.rstrip()  # remove '\n' at end of line
        if num == line:
            print(line )
Run Code Online (Sandbox Code Playgroud)


len*_*nik 6

你应该使用正则表达式来找到你需要的一切:

import re
p = re.compile(r'(\d+)')  # a pattern for a number

for line in file :
    if num in p.findall(line) :
        print line
Run Code Online (Sandbox Code Playgroud)

正则表达式会将一行中的所有数字作为列表返回,例如:

>>> re.compile(r'(\d+)').findall('123kh234hi56h9234hj29kjh290')
['123', '234', '56', '9234', '29', '290']
Run Code Online (Sandbox Code Playgroud)

所以你不匹配 '200' 或 '220' 为 '20'。