Comment puis-je savoir si un fichier est binaire (non textuel) en Python ?
J'effectue une recherche dans un grand ensemble de fichiers en Python, et je continue à obtenir des correspondances dans des fichiers binaires. Cela donne un aspect incroyablement désordonné à la sortie.
Je sais que je pourrais utiliser grep -I
mais je fais plus avec les données que ce que grep permet.
Dans le passé, j'aurais simplement cherché les caractères supérieurs à 0x7f
mais utf8
et autres, rendent cela impossible sur les systèmes modernes. Idéalement, la solution devrait être rapide.
0 votes
SI "dans le passé, j'aurais simplement cherché les caractères supérieurs à 0x7f", alors vous aviez l'habitude de travailler avec du texte ASCII brut, alors il n'y a toujours pas de problème puisque le texte ASCII codé en UTF-8 reste ASCII (c'est-à-dire pas d'octets > 127).
0 votes
@ : C'est vrai, mais il se trouve que je sais que certains des fichiers dont je m'occupe sont en utf8. Je voulais dire "utilisé pour" au sens général, pas au sens spécifique de ces fichiers :)
1 votes
Seulement avec des probabilités. Vous pouvez vérifier si : 1) le fichier contient \n 2) Quantité d'octets entre \n s est relativement petit (ceci n'est PAS fiable)l 3) le fichier ne contient pas d'octets dont la valeur est inférieure à celle du caractère "espace" (' ') de l'ASCCI - SAUF " \n " " \r " " \t " et des zéros.
3 votes
La stratégie qui
grep
qu'il utilise lui-même pour identifier les fichiers binaires est similaire à celui posté par Jorge Orpinel debajo de . À moins que vous ne définissiez le-z
l'option, il recherchera simplement un caractère nul ("\000"
) dans le fichier. Avec-z
il recherche"\200"
. Les personnes intéressées et/ou sceptiques peuvent consulter la ligne 1126 de l'annuaire de l'UE.grep.c
. Désolé, je n'ai pas pu trouver une page web avec le code source, mais bien sûr vous pouvez l'obtenir à partir de gnu.org ou via un distro .3 votes
P.S. Comme mentionné dans le fil de commentaires de l'article de Jorge, cette stratégie donnera des faux positifs pour les fichiers contenant, par exemple, du texte UTF-16. Néanmoins, les deux
git diff
et GNUdiff
utilisent également la même stratégie. Je ne sais pas si elle est si répandue parce qu'elle est beaucoup plus rapide et facile que l'alternative, ou si c'est juste à cause de la rareté relative des fichiers UTF-16 sur les systèmes qui ont tendance à avoir ces utilitaires installés.0 votes
Utilisez une bibliothèque (voir ma réponse ci-dessous).
0 votes
Utilice
perl -ne 'print if -B' filename
voir stackoverflow.com/questions/29516984/ . Voir github.com/Perl/perl5/blob/blead/pp_sys.c#L3543 pour la mise en œuvre.