2017-01-17 1 views
2

J'essaye de lire un fichier en python en binaire. Im intéressé par quatre octets à la fois, mais je semble être coincé dans la tristement célèbre en boucle:Python, EOF binaire

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

print "EOF" 

J'ai essayé ce depuis une heure, je n'arrive à la fin du fichier, même dans de minuscules fichiers texte. J'ai fait un "print test = 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 déclaration if disant si file.read (4) (dans une variable) == "" {4} ou quelque chose, mais cela pourrait effectivement apparaître dans un fichier, non? donc ça pourrait potentiellement s'arrêter au milieu.

La seule autre option est-elle de calculer au préalable la taille du fichier?

Répondre

2

A la fin du fichier, file.read(..) renvoie un octets (ou une chaîne en fonction de votre version de python):

Vérifiez la valeur de retour de la file.read; briser si elle 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 
+1

'fichier' ne sera jamais' Falsy'. 'while file' devrait être' while true' –

+0

@ Jean-FrançoisFabre, Merci pour le pointage. Je mets à jour le code en conséquence. BTW, même avant le changement, le code devrait fonctionner à cause de «si ... pause» – falsetru

+0

Brillant! Merci beaucoup – user7430676

1

file est un objet _io.BufferReader, non None, donc ne jamais être traité comme False.

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

+0

il n'y a pas d'objet 'File', mais vous avez raison. S'il vous plaît améliorer votre poste un peu afin que je puisse upvote :) –

+0

@ Jean-FrançoisFabre Oh, je vois. C'est _io.BufferReader, merci. –

+0

en python 3, oui. En python 2 c'est 'file'. La formulation est mauvaise, cependant: 'list' est un objet, et peut être traité comme" falsy "quand il est vide. Idem pour la chaîne vide. Ce n'est pas la vraie raison. La raison en est que l'objet fichier a un type _cannot_ être "falsifié" quand le fichier est entièrement lu, contrairement au modèle C++ –