2009-08-03 10 views
1

Essayer de comprendre comment vous êtes censé lire les fichiers en python. Voilà ce que je l'ai fait et il ne fonctionne pas correctement tout à fait:Lire des fichiers en python

import os.path 

filename = "A 180 mb large file.data" 
size = os.path.getsize(filename) 

f = open(filename, "r") 
contents = f.read() 
f.close() 

print "The real filesize is", size 
print "The read filesize is", len(contents) 

f = open(filename, "r") 

size = 0 

while True: 
    contents = f.read(4) 
    if not contents: break 
    size += len(contents) 

f.close() 

print "this time it's", size 

Sorties:

The real filesize is 183574528 
The read filesize is 10322 
this time it's 13440 

Quelqu'un sait ce qui se passe ici? :)

+1

Êtes-vous sur Windows? Que se passe-t-il si vous ouvrez le fichier avec le mode "rb" à la place? – Amber

Répondre

5

Si votre fichier confond les bibliothèques C, alors vos résultats sont attendus.

L'OS pense que c'est 180Mb. Cependant, il existe des octets nuls dispersés, ce qui peut perturber les bibliothèques C stdio. Essayez d'ouvrir le fichier avec "rb" et voyez si vous obtenez des résultats différents.

3

Le premier est le filesize en octets, les autres fois que vous lisez le fichier sous forme de texte et comptent caractères. Remplacez tous open(filename, "r") par open(filename, "rb") et cela fonctionne.

+0

Alors, comment vérifiez-vous la taille d'une chaîne en octets? Parce que c'est ce que vous obtenez, n'est-ce pas, une chaîne de f.read? Disons que je voudrais envoyer un fichier d'un ordinateur à un autre, et qu'il s'agit d'un fichier volumineux, il faut donc l'envoyer morceau par morceau. Tout d'abord, l'ordinateur d'envoi enverrait la taille du fichier, de sorte que l'autre ordinateur sache à quoi s'attendre. Ensuite, il commencerait à envoyer le fichier. L'autre ordinateur devrait calculer combien d'octets il a reçu, ainsi il saurait quand le fichier entier a été envoyé. Alors, comment pouvez-vous vérifier cela? – quano

0

Il ne s'agit pas de chaînes: Python est parfaitement satisfait des octets nuls dans les chaînes. C'est parce que vous êtes sur Windows et que vous ouvrez le fichier en mode texte, donc il convertit tout "\ n" en "\ r \ n", détruisant ainsi toutes vos données binaires. Ouvrez votre fichier en mode binaire avec le mode "rb"

Questions connexes