2017-09-10 1 views
1

Comment rechercher un fichier en utilisant grep pour une chaîne de caractères Unicode? J'essaie de compter le nombre d'occurrences de la chaîne "\ xfe \ n \ xfe". Je peux trouver ceci avec Python en faisant:Comment faire un grep pour les caractères Unicode?

open(filename).read().count('\xfe\n\xfe') 

Cela trouve quelques milliers de correspondances.

Cependant, comme cela charge le fichier entier en mémoire, il se bloque si j'essaie de rechercher un fichier plus grand que la mémoire de mon système.

Je suis en train de faire l'équivalent avec grep via:

grep -P -c "\xfe\n\xfe" filename 

Il consomme presque 0 mémoire, qui est grande, mais même si j'exécuter sur le même fichier, il trouve 0 matchs. Quel est le problème avec ma syntaxe?

+0

'grep' fonctionne sur une base de ligne. –

+0

Vous n'avez pas besoin de lire le fichier entier en mémoire en python. Ou, étant donné un terminal sain (enfin, au moins, un qui utilise le même encodage que votre fichier), vous pouvez simplement coller les caractères sans les échapper. c'est-à-dire "grep" fonctionne. – pvg

+0

J'ai testé sur le fichier avec 160000 lignes (contenant 40000 correspondances). Python irait beaucoup plus vite contre grep dans ce cas. La solution de @Moses Koledoye devrait bien fonctionner – RomanPerekhrest

Répondre

1

Vous n'avez pas besoin de lire le fichier entier en mémoire. Vous pouvez itérer sur le fichier et compter l'occurrence de cette chaîne sur des lignes prenant une paire de lignes à chaque instant:

count = 0 
with open(filename) as f: 
    prev_line = next(f) 
    for line in f: 
     if prev_line.endswith('\xfe\n') and line.startswith('\xfe'): 
     count += 1 
     prev_line = line