Seite 1 von 1

Datei im Speicher, trotzdem durch Name identifiziert?

Verfasst: Sonntag 8. Dezember 2024, 18:40
von zegru
Ich suche die Möglichkeit, eine Datei im Speicher zu definieren, sie aber dennoch durch einen Namen anzusprechen. Ich kenne zwar StringIO, das ist aber lediglich etwas ähnliches wie eine Datei, aber eben keine Datei. Ich suche etwas ähnliches wie das hier (was in dieser Form aber nicht funktioniert):

Code: Alles auswählen

test_content = 'Ein Test'
with open('mem:test_content', 'r', encoding='utf8') as reader:
    read_content = reader.read()
    print(read_content)
    
Ein Test
Hat jemand eine Idee?

Re: Datei im Speicher, trotzdem durch Name identifiziert?

Verfasst: Sonntag 8. Dezember 2024, 18:54
von __blackjack__
@zegru: Welches Problem soll das denn lösen? Das ist etwas was man normalerweise ausserhalb des Programms löst, mit einer ”RAM-Disk”.

Re: Datei im Speicher, trotzdem durch Name identifiziert?

Verfasst: Sonntag 8. Dezember 2024, 19:47
von zegru
Der konkrete Fall: Ich habe ein Programm, das eine Datei ausliest. Diese Funktion möchte ich testen. Ich möchte aber nicht etliche reale Dateien erstellen, sondern deren Inhalt im Code des Tests haben.
Eventuell ergibt sich hier ja eine andere Möglichkeit, das zu testen.

Re: Datei im Speicher, trotzdem durch Name identifiziert?

Verfasst: Sonntag 8. Dezember 2024, 20:04
von noisefloor
Hallo,

das io ist aber genau dafür da... Das allererste Beispiel unter "Text I/O" zeigt doch exakt das, was du suchst...

Gruß, noisefloor

Re: Datei im Speicher, trotzdem durch Name identifiziert?

Verfasst: Sonntag 8. Dezember 2024, 20:14
von zegru
Welchen Code dort meinst Du genau?

Re: Datei im Speicher, trotzdem durch Name identifiziert?

Verfasst: Sonntag 8. Dezember 2024, 22:08
von narpfel
Oder, wenn es denn unbedingt richtige Dateien sein müssen und `io.StringIO` nicht reicht: https://docs.pytest.org/en/stable/how-to/tmp_path.html

Re: Datei im Speicher, trotzdem durch Name identifiziert?

Verfasst: Sonntag 8. Dezember 2024, 22:47
von __blackjack__
@zegru: Wenn der Code von Dir selbst ist, dann schreib ihn einfacher testbar. Ich habe für mich beispielsweise die Konvention entwickelt eine Funktion oder Methode zu schreiben die `read_irgendwas()` heisst und ein Dateiobjekt entgegennimmt, und eine die `load_irgendwas()` heisst und einen Dateinamen oder Pfad nimmt und die `read_irgendwas()` aufruft. Das gleiche kann man mit `write()` und `save()` machen.

Re: Datei im Speicher, trotzdem durch Name identifiziert?

Verfasst: Sonntag 8. Dezember 2024, 22:57
von zegru
Eine andere Idee kam mir: Im Test eine temporäre Datei erzeugen und die mit einem String aus dem Code befüllen. Für den Test hat man dann den Dateinamen zur Verfügung.
Spricht etwas gegen diesen Ansatz, das ich noch nicht auf dem Schirm hatte?

Re: Datei im Speicher, trotzdem durch Name identifiziert?

Verfasst: Sonntag 8. Dezember 2024, 23:08
von sparrow
Ich kenne das aus Projekten auch nur so, wie __blackjack__ es beschreibt.
Du trennst die Funktionalität des Lesens und der Verarbeitet. Und das kannst (und ggf. solltest) du dann getrennt testen.
Temporäre Dateien zu verwenden finde ich schwierig. Das könnte man machen - um das reine Lesen zu testen. Habe ich aber noch nie gesehen.

Aber um das nochmal zu unterstreichen: Ich halte es für richtig "Datei öffnen und Daten lesen" und "Daten verarbeiten" funktional voneinander zu trennen. Und dann ist die Verarbeitung auch entsprechend testbar.