web-dev-qa-db-fra.com

Rechercher un fichier et trouver une correspondance exacte et une ligne d'impression?

J'ai cherché autour mais je n'ai trouvé aucun post pour m'aider à résoudre ce problème, j'ai trouvé pareil mais je n'ai rien trouvé qui résout ce problème seul.

Voici le problème que j'ai, j'essaye de faire rechercher par un script python un fichier texte, le fichier texte contient des numéros dans une liste et chaque numéro correspond à une ligne de texte et si la correspondance raw_input correspond au nombre exact dans le fichier texte il imprime toute la ligne de texte. Jusqu'ici, il affiche n'importe quelle ligne contenant le numéro.

Exemple du problème, l’utilisateur tape 20, puis la sortie correspond à tout ce qui contient un 2 et un 0, donc j’obtiens 220 foo200 bar etc. Comment puis-je résoudre ce problème afin qu’il trouve juste "20"

voici le code que j'ai

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

Merci. 

6
Robots

Pour vérifier une correspondance exacte, utilisez num == line. Mais line a un caractère de fin de ligne \n ou \r\n qui ne sera pas dans num car raw_input supprime la nouvelle ligne. Il peut donc être pratique de supprimer tous les espaces blancs à la fin de line avec 

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

vous devriez utiliser des expressions régulières pour trouver tout ce dont vous avez besoin:

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

for line in file :
    if num in p.findall(line) :
        print line

expression régulière vous renverra tous les nombres d'une ligne sous forme de liste, par exemple:

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

donc vous ne correspondez pas à «200» ou «220» pour «20».

2
lenik

Construire des listes de lignes appariées - plusieurs variantes:

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

Construire un générateur de lignes appariées (efficace en mémoire):

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

Imprimez toutes les lignes correspondantes (recherchez toutes les correspondances en premier, puis imprimez-les):

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

Imprimez toutes les lignes correspondantes (imprimez-les paresseusement, comme nous les trouvons)

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

Les générateurs (produits par yield) sont vos amis, en particulier avec les gros fichiers qui ne tiennent pas dans la mémoire.

2
The Aelfinn

C'est très facile:

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

Le chèque doit être comme ça:

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

Si file.txt a une disposition comme celle-ci:

1 foo
20 bar
30 20

Nous scindons "1 foo" en ['1', 'foo'] et utilisons simplement le premier élément, qui est le nombre.

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