web-dev-qa-db-ja.com

ファイルを検索して完全に一致する行を検索しますか?

私は周りを検索しましたが、この問題を解決するのに役立つ投稿を見つけることができませんでした、私は同様のことがわかりましたが、とにかくこれだけに対処するものは見つかりませんでした。

ここに私が持っている問題があります、私はpythonスクリプトがテキストファイルを検索しようとしている、テキストファイルはリストに番号があり、すべての番号はテキストの行に対応raw_inputは、そのテキスト行全体を印刷するテキストファイル内の正確な番号に一致しますが、これまでは番号を含むすべての行を印刷します。

問題の例、ユーザーが20と入力すると、出力は20を含むすべてのものになるため、220 foo200 barなどを取得できます。これを修正して「20」を見つけます

ここに私が持っているコードがあります

num = raw_input ("Type Number : ")
search = open("file.txt")
for line in search:
 if num in line:
  print line 

ありがとう。

9
Robots

exactの一致を確認するには、num == lineを使用します。ただし、lineには行末文字\nまたは\r\nがあり、raw_inputは末尾の改行を削除するため、numには含まれません。したがって、lineの最後にあるすべての空白を削除すると便利です

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 )
10
unutbu

一致した行のリストを作成-いくつかのフレーバー:

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によって生成されます)は、特にメモリに収まらない大きなファイルの場合の友達です。

4
The Aelfinn

必要なものすべてを見つけるには、正規表現を使用する必要があります。

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

そのため、「20」に対して「200」または「220」は一致しません。

2
lenik

それは非常に簡単です:

numb = raw_input('Input Line: ')
fiIn = open('file.txt').readlines()
for lines in fiIn:
   if numb == lines[0]:
      print lines
1
Oni1

チェックは次のようにする必要があります。

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

File.txtに次のようなレイアウトがある場合:

1 foo
20 bar
30 20

"1 foo" into ['1', 'foo']そして最初の項目、つまり数字を使用します。

0
naeg
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
0
Jetlef