2017-08-22 3 views
0

J'écris en python 3.6 et j'ai de la difficulté à faire correspondre mon code à des chaînes de caractères dans un document texte court. ceci est un exemple simple de la logique exacte qui brisait mon programme plus:Vérifier si la chaîne est dans le fichier texte ne fonctionne pas

PATH = "C:\\Users\\JoshLaptop\\PycharmProjects\\practice\\commented.txt" 

file = open(PATH, 'r') 

words = ['bah', 'dah', 'gah', "fah", 'mah'] 

print(file.read().splitlines()) 

if 'bah' not in file.read().splitlines(): 
    print("fail") 

avec le document de texte formaté comme ceci:

bah 
gah 
fah 
dah 
mah 

et il imprime en effet à échouer chaque fois que je lance ce . Est-ce que j'utilise la méthode incorrecte de lecture des données du document texte?

+2

Vous avez déjà 'lu 'le fichier, donc quand vous le' lisez 'la deuxième fois, il n'y a plus aucun contenu à lire. Débarrassez-vous de votre instruction 'print' ou utilisez' file.seek (0) '. –

+2

Vous lisez le fichier plusieurs fois avant de le fermer. Ajoutez 'file.seek (0)' après votre instruction 'print', ou stockez le contenu dans une variable – Wondercricket

+0

Essayez ce' si 'bah' n'est pas dans la liste (file.readlines()) ' –

Répondre

1

le problème est que vous imprimez print(file.read().splitlines())

il épuise le fichier, et le prochain appel à file.read().splitlines() retourne une liste vide ...

Une meilleure façon de « grep » votre modèle serait être d'itérer sur les lignes de fichiers au lieu de le lire complètement. Donc, si vous trouvez la chaîne au début du fichier, vous gagnez du temps:

with open(PATH, 'r') as f: 
    for line in f: 
     if line.rstrip()=="bah": 
      break 
    else: 
     # else is reached when no break is called from the for loop: fail 
     print("fail") 

La petite prise ici est de ne pas oublier d'appeler line.rstrip() car générateur de fichier émet la ligne avec la terminaison de ligne. De plus, s'il y a un espace de fin dans votre fichier, ce code correspondra toujours le mot (faire strip() si vous voulez faire correspondre même avec grands blancs)

Si vous voulez faire correspondre beaucoup de mots, envisager la création une set de lignes:

lines = {line.rstrip() for line in f} 

afin que votre in lines appel sera beaucoup plus rapide.

0

Vous ne pouvez pas lire le fichier deux fois.

Lorsque vous faites print(file.read().splitlines()), le fichier est lu et l'appel suivant à cette fonction ne retournera rien parce que vous êtes déjà à la fin du fichier.

1

Essayez:

PATH = "C:\\Users\\JoshLaptop\\PycharmProjects\\practice\\commented.txt" 
file = open(PATH, 'r') 
words = file.read().splitlines() 
print(words) 
if 'bah' not in words: 
    print("fail") 
0
PATH = "your_file" 

file = open(PATH, 'r') 

words = ['bah', 'dah', 'gah', "fah", 'mah'] 

if 'bah' not in (file.read().splitlines()) : 
    print("fail") 

que vous pouvez voir la sortie est pas 'échec', vous devez utiliser un dans le code ou l'enregistrer dans une autre variable 'file.read()) (lignes de division.' sinon vous avez un message 'fail'