Comment mettre en œuvre une pythonic équivalent de la queue-F?
Quel est le pythonic manière de regarder la fin de la queue de croissance de fichier pour l'occurrence de certains mots-clés?
Dans le shell, je pourrais dire:
tail -f "$file" | grep "$string" | while read hit; do
#stuff
done
- Un peu similaire: stackoverflow.com/questions/136168/tail-a-file-with-python
- Ces deux questions semblent identiques, mais celui-ci est constamment en train de surveiller un fichier pour les nouvelles lignes, tandis que l'autre question est à propos de la lecture de la dernière x lignes
Vous devez vous connecter pour publier un commentaire.
Bien, la façon la plus simple serait constamment lire à partir du fichier, vérifier ce qui est nouveau et de test pour les hits.
Cette solution avec
readline
fonctionne si vous savez que vos données apparaissent dans les lignes.Si les données est une sorte de flux vous avez besoin d'un tampon, plus grand que le plus grand
word
vous êtes à la recherche pour, et remplissez-le d'abord. Il devient un peu plus compliqué de cette façon...Je l'utilise pour surveiller les fichiers journaux. Dans la mise en œuvre complète, je garde list_of_matches dans un fichier de configuration de sorte qu'il peut être utilisé à des fins multiples. Sur ma liste des améliorations est le support pour l'expression rationnelle au lieu d'un simple "dans" match.
Vous pouvez utiliser select pour interroger de nouveau contenu dans un fichier.
EDIT: comme le commentaire ci-dessous des notes,
O_NONBLOCK
ne fonctionne pas pour les fichiers sur le disque. Ce sera toujours de l'aide si quelqu'un d'autre vient le long de la recherche à la queue de données en provenance de socket ou le nom du tuyau ou d'un autre processus, mais il ne répond pas à la question qui a été posée. Réponse originale à cette question reste en dessous pour la postérité. (L'appel à la queue et grep va travailler, mais qui est une non-réponse de toutes sortes, de toute façon.)Ouvrir le fichier avec
O_NONBLOCK
et l'utilisationselect
d'interrogation pour lire la disponibilité et ensuiteread
de lire les nouvelles données et les méthodes string pour filtrer les lignes sur la fin d'un fichier...ou tout simplement utiliser lesubprocess
module et laisseztail
etgrep
faire le travail pour vous, tout comme vous le feriez dans la coquille.vous pouvez utiliser pytailf : Simple python tail-f wrapper
Semble qu'il y ait un paquet pour que: https://github.com/kasun/python-tail
Si vous ne pouvez pas contrainte de le problème à travailler pour une ligne de base de lecture, vous avez besoin de recourir à des blocs.
Cela devrait fonctionner:
Le défi consiste à s'assurer que vous correspondez à l'aiguille, même si il est séparé par deux bloc-limites.
À ma connaissance, il n'y a pas l'équivalent d'une "queue" dans la fonction Python liste. La Solution serait d'utiliser tell() (obtenir la taille du fichier) et read() pour travailler sur la fin des lignes.
Ce blog (pas par moi) a la fonction écrite, semble approprié pour moi!
http://www.manugarg.com/2007/04/real-tailing-in-python.html
Si vous avez juste besoin d'un simple morts Python 3 solution pour le traitement des lignes d'un fichier texte comme ils sont écrits, et vous n'avez pas besoin de support de Windows, cela a bien fonctionné pour moi:
Il bloque en attente de nouvelles lignes à écrire, donc ce n'est pas adapté pour une utilisation asynchrone sans quelques modifications.
Vous pouvez utiliser
collections.deque
pour mettre en œuvre la queue.De http://docs.python.org/library/collections.html#deque-recipes ...
Bien sûr, ce lit l'intégralité du contenu du fichier, mais c'est un très joli et laconique de la mise en œuvre de la queue.