Python EOF pour multi-octets demandes de fichier.lire()
Le Python docs sur fichier.lire() état que An empty string is returned when EOF is encountered immediately.
La documentation stipule en outre:
Noter que cette méthode peut appeler la
C sous-jacente de la fonction fread() plus
fois, dans un effort pour acquérir
près de la taille octets que possible. Aussi
notez qu'en mode sans blocage,
moins de données que ce qui était demandé peut être
renvoyé, même si aucun paramètre de taille
a été donné.
Je crois que Guido a fait son point de vue sur les pas de l'ajout de f.eof() PARFAITEMENT CLAIR donc besoin d'utiliser le Python!
Ce n'est pas clair pour MOI, cependant, est de savoir si c'est un test définitif que vous avez atteint EOF si vous recevez moins de la demande d'octets à partir d'une lecture, mais vous avez reçu certains.
ie:
with open(filename,'rb') as f:
while True:
s=f.read(size)
l=len(s)
if l==0:
break # it is clear that this is EOF...
if l<size:
break # ? Is receiving less than the request EOF???
Est-il un potentiel d'erreur de break
si vous avez reçu moins de les octets demandés dans un appel à file.read(size)
?
OriginalL'auteur dawg | 2010-12-13
Vous devez vous connecter pour publier un commentaire.
Vous ne pensez pas avec votre peau de serpent sur... Python n'est pas C.
Tout d'abord, un examen:
n
octets et en aucun cas plus den
octets;Si un fichier de la méthode de lecture est à des expressions du FOLKLORE, il retourne
''
. Le même type de EOF test est utilisé dans l'autre fichier comme" méthodes comme StringIO, socket.makefile, etc. Un retour de moins den
octets def.read(n)
est certainement PAS un dispositif de test pour les expressions du FOLKLORE! Bien que ce code ne peut travailler à 99,99% du temps, c'est le temps qu'il n'a pas de travail qui pourrait être très frustrant pour les trouver. De Plus, il est mauvais Python forme. La seule utilisation pourn
dans ce cas est de mettre une limite supérieure sur la taille de la déclaration.Quelles sont certaines des raisons pour lesquelles le fichier Python-comme des méthodes renvoie moins que
n
octets?n
octets peut provoquer une rupture entre la logique de caractères multi-octets (comme\r\n
en mode texte et, je pense, un de caractères multi-octets Unicode) ou de certains sous-jacente de la structure de données que vous ne connaissez pas;Je voudrais réécrire votre code de cette manière:
Ou, écrire un générateur:
OriginalL'auteur the wolf
Voici ce que mon compilateur C de la documentation dit pour le
fread()
fonction:De sorte qu'il ressemble de moins que
size
signifie soit une erreur s'est produite ou expressions du FOLKLORE a été atteint --break
ing hors de la boucle serait la bonne chose à faire.Je dirais que, si une courte lecture se produit parce que le programme a reçu un signal, mais le gestionnaire de signal ignoré, la boucle encore doivent être terminés depuis signaux indiquent en général des erreurs fatales ou que les utilisateurs veut interrompre le processus-même si c'est exactement EOF ou pas, sortir de la boucle est probablement la bonne chose à faire.
Je suis d'accord qu'en est-il sain d'esprit pour un gestionnaire de signal pour provoquer un court-lire, mais je suis en désaccord que c'est une condition d'erreur. Un de mes scripts garde de traitement de données provenant de l'entrée standard jusqu'à ce que les expressions du FOLKLORE.
SIGUSR1
est configuré pour rincer immédiatement les données, ce qui provoque un court de lire ce qui est attendu et pas une erreur.OriginalL'auteur martineau