Datei input/output als gzip, oder plain text ermöglichen.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Mick
User
Beiträge: 9
Registriert: Mittwoch 8. Januar 2020, 09:12

Hallo Leute,

ein Skript soll eine textbasierte Datei öffnen, mit dem Inhalt eine ganze Menge herumarbeiten und dann die Ergebnisse in einer anderen ebenfalls textbasierten Datei abspeichern. Ich möchte, dass das Skript optional auch mit, mit gzip komprimierte Dateien, arbeiten kann. Wie kann ich meinen Code am besten anpassen, damit das klappt? Folgendes habe ich mir ausgedacht:

Code: Alles auswählen

import gzip
files_as_gzip = True

file_path_input = '/home/user/input.txt.gz'

file_path_output = '/home/user/output.txt'
file_path_output += '.gz' if files_as_gzip else ''

my_open_function = gzip.open if files_as_gzip else open
my_open_options_input = 'rt' if files_as_gzip else 'r'
my_open_options_output = 'wt' if files_as_gzip else 'w'

input = []

with my_open_function(file_path_input,my_open_options_input) as file:
	for line in file:
		input.append(line)

with my_open_function(file_path_output,my_open_options_output) as file:
	for line in input:
		file.write(line)
Also my_open_function() entweder als gzip.open() definieren oder also normales open() je nachdem ob gzip oder normale Textdatei verwendet werden soll. Ich verwende für das Lesen der Datei einen parser und für das schreiben der Datei ganz einfach die .write() Funktion. Bisher funktioniert das so. Kann man das so machen oder führt das zu Problemen?

Alternativ könnte man halt das ganze Skript mit if/else Abzweigungen immer aufteilen in einen Pfad für gzip und einen für txt. Oder wenn gzip gewünscht ist erstmal den Inhalt in eine temporäre Datei entpacken und dann mit dieser Datei arbeiten und beim output andersherum erst in eine ungepackte temporäre Datei schreiben und dann am Ende die Datei komprimieren.

Würde mich freuen wenn mir jemand kurz sagen könnte wie man sowas am elegantesten löst. Vielen Dank.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Ein Weg wäre, eine eigene open-Funktion zu schreiben:

Code: Alles auswählen

def open_file(filename, mode):
    if filename.endswith('.gz'):
        return gzip.open(filename, mode)
    return open(filename, mode)
Benutzeravatar
__blackjack__
User
Beiträge: 14051
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Und beim Modus würde man da dann einfach die ohne "t" oder "b" in welche mit "t" umsetzen, denn beim normalen `open()` ist beispielsweise "r" ja auch nur eine Abkürzung von "rt".

Wenn es Textdateien sind, sollte man auch eine Kodierung angeben.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Mick
User
Beiträge: 9
Registriert: Mittwoch 8. Januar 2020, 09:12

Danke euch beiden, habs jetzt so wie Sirius vorgeschlagen hat gemacht. Das mit dem modus hab ich noch hinzugefügt. Scheint soweit zu funktionieren :)
Antworten