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 foo
200 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.
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 )
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».
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.
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
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.
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