gzip
selbst wird eine OSError
wenn es sich nicht um eine gzipped-Datei handelt.
>>> with gzip.open('README.md', 'rb') as f:
... f.read()
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "/Users/dennis/.asdf/installs/python/3.6.6/lib/python3.6/gzip.py", line 276, in read
return self._buffer.read(size)
File "/Users/dennis/.asdf/installs/python/3.6.6/lib/python3.6/gzip.py", line 463, in read
if not self._read_gzip_header():
File "/Users/dennis/.asdf/installs/python/3.6.6/lib/python3.6/gzip.py", line 411, in _read_gzip_header
raise OSError('Not a gzipped file (%r)' % magic)
OSError: Not a gzipped file (b'# ')
Sie können diesen Ansatz mit einigen anderen kombinieren, um die Sicherheit zu erhöhen, wie z. B. die Überprüfung des Mimetyps oder die Suche nach einer magischen Zahl im Header der Datei (siehe andere Antworten für ein Beispiel) und die Überprüfung der Erweiterung.
import pathlib
if '.gz' in pathlib.Path(filepath).suffixes:
# some more inexpensive checks until confident we can attempt to decompress
# ...
try ...
...
except OSError as e:
...
2 Stimmen
Nur ein kleiner Hinweis: Verlassen Sie sich niemals auf die Dateiendung. Wie man das macht, steht in Hops Antwort.
0 Stimmen
@Helper: Ich bin mir nicht sicher (siehe mein Edit). Sie müssten immer noch mit einem möglichen IOError umgehen, aber gzipped Dateien ohne das Suffix sind meiner Meinung nach kaputt schwere Entscheidung :)