Leider wird ein solcher Versuch wahrscheinlich ein gewisses Mehr an Aufwand haben, wäre es wahrscheinlich billiger, die Ausnahme zu fangen, wie die Benutzer oben kommentiert. Eine gzip Datei einige feste Größe Regionen definiert, wie folgt:
Feste Regionen
Erstens gibt es 2 Bytes für die gzip magische Zahl, 1 Byte für das Komprimierungsverfahren, 1 Byte für die Flags, dann 4 weitere Bytes für die MTIME (Dateierstellungszeit), 2 Bytes für zusätzliche Flags und zwei weitere Bytes für das Betriebssystem, was insgesamt 12 Bytes ergibt.
Dies wird wie folgt aussieht (aus dem obigen Link):
+---+---+---+---+---+---+---+---+---+---+
|ID1|ID2|CM |FLG| MTIME |XFL|OS | (more-->)
+---+---+---+---+---+---+---+---+---+---+
Variable Regionen
Dies ist jedoch, wo die Dinge schwierig werden (und nicht ohne Verwendung eines gzip-Modul oder ein anderes zu überprüfen Deflator).
Wenn zusätzliche Felder gesetzt wurden, gibt es eine variable Region XLEN danach eingestellt Bytes, die wie folgt aussieht:
(if FLG.FEXTRA set)
+---+---+=================================+
| XLEN |...XLEN bytes of "extra field"...| (more-->)
+---+---+=================================+
Danach gibt es dann eine Region von N Bytes, mit einem Null-terminierte Zeichenfolge für die Dateinamen (das ist standardmäßig gespeichert):
(if FLG.FNAME set)
+=========================================+
|...original file name, zero-terminated...| (more-->)
+=========================================+
Wir haben dann Anmerkungen:
(if FLG.FCOMMENT set)
+===================================+
|...file comment, zero-terminated...| (more-->)
+===================================+
Und schließlich, ein CRC16 (eine zyklische Redundanzprüfung, um sicherzustellen, dass der Dateiheader dann funktioniert, bevor wir in die variablen, komprimierten Daten gelangen.
Lösung
So wird jede Art von fester Größe geprüft, ob der Dateiname abhängig sein, oder, wenn es über die Leitung geschrieben wurde (gzip -c "Compress this data" > myfile.gz
), anderen Bereichen, und Kommentare, die alle, die für definiert werden können Null-Dateien. Also, wie umgehen wir das? Einfache, verwenden Sie die gzip-Modul:
import gzip
def check_null(path):
'''
Returns an empty string for a null file, which is falsey,
and returns a non-empty string otherwise (which is truthey)
'''
with gzip.GzipFile(path, 'rb') as f:
return f.read(1)
Dies wird überprüfen, ob alle Daten innerhalb der erstellten Datei vorhanden ist, während nur einen kleinen Teil der Daten gelesen werden. Es dauert jedoch eine Weile, es ist einfacher, um Vergebung zu bitten, als um Erlaubnis zu bitten.
import contextlib # python3 only, use a try/except block for Py2
import pandas as pd
with contexlib.suppress(pd.parser.CParserError as error):
df = pd.read_csv(path, compression='gzip', names={'a', 'b', 'c'}, header=False)
# do something here
Es gibt ein Modul [gzip] (https://docs.python.org/2/library/gzip.html). Hast du das versucht? – SiHa
Ich habe mir die Dokumentation angesehen, soweit ich weiß, dass es keine solche Methode gibt. Abgesehen von der Bezeichnung des Moduls möchten Sie etwas Spezifisches in diesem Modul vorschlagen? – Vipin
Eine leere Datei hat die Größe 0. –