J'essaye de lire un fichier en python en binaire. Je m'intéresse à quatre octets à la fois, mais il me semble que je suis coincé dans la tristement célèbre boucle while:

with open(filename, "rb") as file:
      while file:
            file.read(4)

print "EOF"

J'essaie cela depuis une heure, je n'atteins jamais la fin du fichier, même dans de petits fichiers texte. J'ai fait un "test d'impression = file.read (4)" seulement pour voir qu'il imprime ""

Comment puis-je m'assurer qu'il s'arrête? Ma première idée était de faire une instruction if disant if file.read (4) (dans une variable) == "" {4} ou quelque chose, mais cela pourrait en fait apparaître dans un fichier, non? donc il pourrait potentiellement s'arrêter au milieu de celui-ci.

Est-ce la seule autre option pour calculer au préalable la taille du fichier?

2
user7430676 17 janv. 2017 à 16:37

2 réponses

Meilleure réponse

À la fin du fichier, file.read(..) renverra un octet (ou une chaîne selon votre version de python):

Vérifiez la valeur de retour de file.read; casser s'il est vide:

with open(filename, "rb") as file:
    while True:  # --> replaced `file` with `True` to be clear
        data = file.read(4)
        if not data:  # empty => EOF
        # OR   if len(data) < 4: if you don't want last incomplete chunk
            break
        # process data
2
falsetru 17 janv. 2017 à 13:41

file est un objet _io.BufferedReader, pas None, donc ne soyez jamais traité comme False.

Vous devriez vérifier si la valeur de retour de file.read(4) est une chaîne vide (traitée comme False).

1
yslee 17 janv. 2017 à 14:23