18

我四处搜寻,但找不到任何帖子来帮助我解决此问题,我发现了类似的但无论如何我都找不到任何解决此问题的方法。

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

问题示例,用户类型20然后输出是包含 a2和 a 的所有内容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 

谢谢。

4

7 回答 7

22

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

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)]

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

def generate_lines_that_equal(string, fp):
    for line in fp:
        if line == string:
            yield line

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

with open("file.txt", "r") as fp:
    for line in lines_that_equal("my_string", fp):
        print line

打印所有匹配的行(懒惰地打印它们,因为我们找到它们)

with open("file.txt", "r") as fp:
    for line in generate_lines_that_equal("my_string", fp):
        print line

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

于 2016-10-25T15:29:55.830 回答
15

要检查完全匹配,您将使用num == line. 但是line有一个行尾字符\n,或者由于去掉了尾随的换行符\r\n而不会出现。因此,在with的末尾删除所有空格可能会很方便numraw_inputline

line = line.rstrip()

with open("file.txt") as search:
    for line in search:
        line = line.rstrip()  # remove '\n' at end of line
        if num == line:
            print(line )
于 2013-03-30T11:38:39.247 回答
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

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

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

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

于 2013-03-30T11:58:00.300 回答
1

这很容易:

numb = raw_input('Input Line: ')
fiIn = open('file.txt').readlines()
for lines in fiIn:
   if numb == lines[0]:
      print lines
于 2013-03-30T11:55:50.080 回答
1
num = raw_input ("Type Number : ")
search = open("file.txt","r")
for line in search.readlines():
    for digit in num:
        # Check if any of the digits provided by the user are in the line.
        if digit in line:
            print line
            continue
于 2013-03-30T13:52:26.033 回答
0

检查必须是这样的:

if num == line.split()[0]:

如果 file.txt 有这样的布局:

1 foo
20 bar
30 20

我们分成"1 foo"['1', 'foo']只使用第一项,即数字。

于 2013-03-30T11:48:43.650 回答
-1

例如,如果您想显示其中包含单词“password”的行,

import re;
fpointer = open("access.log", "r");

for i in fpointer.readlines():
   line= re.findall(r'password', i);
   if line:
    print(i);
fpointer.close();
于 2021-06-04T12:59:20.307 回答