2017-06-26 8 views
0

Disons que j'ai un fichier gz faux test.bson.gz généré par echo "hello world" > test.bson.gz, et je l'ai essayé:faux `.gz` augmenter IOError, « Pas un fichier gzip »

try: 
    bson_file = gzip.open('test.bson.gz', mode='rb') 
except: 
    print("cannot open") 

Aucune exception ne sera pris ici. (Vraiment étrange, puisque ce n'est pas valide ... gz)

Alors je:

data = bson_file.read(4) 

je vais obtenir:

File "/usr/lib/python2.7/gzip.py", line 190, in _read_gzip_header 
    raise IOError, 'Not a gzipped file' 
IOError: Not a gzipped file 

Est-il possible que je puisse déterminer (même erreur de capture) si ce .gz est valide quand j'essaie de l'ouvrir, pas attendre jusqu'à ce que je veux le lire?

Merci!

Répondre

1

Vous pouvez utiliser gzip.peek(n):

Lire n octets non compressés sans avancer la position de fichier.

try: 
    bson_file = gzip.open('test.bson.gz', mode='rb') 
    bson_file.peek(1) 
except OSError: 
    print("cannot open") 

De cette façon, vous attraperez l'erreur sans consommer le contenu du fichier. Astuce: Vous devriez éviter d'attraper toutes les erreurs de manière inconditionnelle. J'ai ajouté except OSError, car IOError a été fusionné à OSError dans Python 3.3 - voir PEP3151.

+0

Attendez ... Il semble que ce code ne fonctionne pas pour BSON valide. Essayez 'bson_file.peek (1)' pour un '.bson.gz' valide, et vous verrez qu'il peut toujours attraper l'erreur. – tclo2