L'utilisation de grep dans python
Il y a un fichier (query.txt) qui a certains mots clés/phrases qui doivent être mis en correspondance avec d'autres fichiers à l'aide de grep. Les trois dernières lignes de code suivantes fonctionnent parfaitement mais quand la même commande qui est utilisée à l'intérieur de la boucle while, il entre dans une boucle infinie ou quelque chose(c'est à dire ne pas répondre).
import os
f=open('query.txt','r')
b=f.readline()
while b:
cmd='grep %s my2.txt'%b #my2 is the file in which we are looking for b
os.system(cmd)
b=f.readline()
f.close()
a='He is'
cmd='grep %s my2.txt'%a
os.system(cmd)
Pourquoi utiliser
C'est une affectation. On nous dit que vous utilisez grep 🙁
Vous avez besoin de guillemets dans votre construit la ligne de commande si votre modèle de recherche a un espace, comme il est dans les 3 dernières lignes de votre test. Vous souhaitez que la commande de lecture:
grep
quand vous avez le re
module en Python?C'est une affectation. On nous dit que vous utilisez grep 🙁
Vous avez besoin de guillemets dans votre construit la ligne de commande si votre modèle de recherche a un espace, comme il est dans les 3 dernières lignes de votre test. Vous souhaitez que la commande de lecture:
grep "He is" my2.txt
Mais comme il se trouve ici, la ligne de commande est: grep He is my2.txt
OriginalL'auteur user1171232 | 2012-01-26
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, vous n'êtes pas à parcourir le fichier correctement. Vous pouvez simplement utiliser
for b in f:
sans.readline()
choses.Puis votre code va souffler dans votre visage dès que le nom de fichier contient des caractères qui ont une signification spéciale dans le shell. Utilisation
sous-processus.appel
au lieu deos.system()
et passer une liste d'arguments.Voici une version fixe:
Cependant, vous pouvez améliorer votre code encore plus en ne demandant pas
grep
à tous.Lire
my2.txt
à une chaîne de caractères à la place, puis utiliser lare
module pour effectuer la recherche. Dans le cas où vous n'avez pas besoin d'une expression régulière, vous pouvez même simplement utiliserif line in my2_content
Voir mon commentaire à eumiro de réponse.
OriginalL'auteur ThiefMaster
Votre code balaye toute la
my2.txt
fichier pour chaque requête dansquery.txt
.Vous voulez:
Essayez ce code:
readline()
garde le terminateur de ligne\n
dans la chaîne renvoyée probablement confondgrep
de plus.OriginalL'auteur eumiro
Ce n'est pas vraiment une bonne façon d'utiliser Python, mais si vous avez à faire quelque chose comme ça, puis le faire correctement:
Et j'espère que votre fichier ne contient pas tous les caractères qui ont une signification particulière dans les expressions régulières =)
Aussi, vous pourriez être en mesure de le faire avec
grep
seul:Il fonctionne comme ceci:
Ce qui est dans votre
query.txt
? Nesubprocess.call(["/bin/grep", "-e", line.strip(), filename])
mieux travailler?Query.txt mots clés/phrases séparées par un saut de ligne. Et non, le changement n'est pas bon et c'est de montrer la même erreur.
J'ai ajouté un exemple qui montre le code qui fonctionne ici. Je ne suis pas sûr que je peux vous aider sans vous de me dire ce qui est dans votre
query.txt
.Je l'ai écrit dans le commentaire ci-dessus que query.txt a. Il a des mots-clés séparés par un saut de ligne. Ce sont les mots-clés qui doivent être mis en correspondance des my2.txt. Merci
OriginalL'auteur cha0site
cela correspond à tous les mots-clés dans query.txt avec my2.txt fichier et enregistrer la sortie dans out.txt
Lire
man grep
pour une description de tous les arguments possibles.OriginalL'auteur sparktime12