2015-09-15 5 views
8

Ich versuche, die Verwendung von Pandas zu simulieren, um auf eine sich ständig ändernde Datei zuzugreifen.Streaming-Daten für Pandas df

Ich habe eine Datei lesen eine CSV-Datei, eine Zeile hinzufügen, dann schlafen für eine zufällige Zeit, um Masseneingabe zu simulieren.

import pandas as pd 
from time import sleep 
import random 

df2 = pd.DataFrame(data = [['test','trial']], index=None) 

while True: 
    df = pd.read_csv('data.csv', header=None) 
    df.append(df2) 
    df.to_csv('data.csv', index=False) 
    sleep(random.uniform(0.025,0.3)) 

Die zweite Datei in Daten für den Wandel ist die Überprüfung durch die Form der Datenrahmen ausgibt:

import pandas as pd 

while True: 
    df = pd.read_csv('data.csv', header=None, names=['Name','DATE']) 
    print(df.shape) 

Das Problem dabei ist, während ich die richtige Form der DF bekommen, gibt es bestimmte Zeiten, in denen es (0x2) ausgibt.

d.h .:

... 
(10x2) 
(10x2) 
... 
(10x2) 
(0x2) 
(11x2) 
(11x2) 
... 

Dies tritt bei einige aber nicht zwischen jeder Formänderung (die Datei zu Datenrahmen hinzufügen).

Wenn das passiert, wenn das erste Skript die Datei zum Hinzufügen von Daten öffnet und das zweite Skript nicht darauf zugreifen kann, also (0x2), tritt dabei ein Datenverlust auf?

Ich kann nicht direkt auf den Stream zugreifen, nur die Ausgabedatei. Oder gibt es andere mögliche Lösungen?

bearbeiten

Der Zweck dieser nur die neuen Daten zu laden ist (ich einen Code, der das tut) und tun Analyse „on the fly“. Einige der Analysen enthalten Ausgabe/Sek., Grafische Darstellung (ähnlich der Stromaufzeichnung) und einige andere numerische Berechnungen.

Das größte Problem ist, dass ich nur Zugriff auf die CSV-Datei habe, und ich muss in der Lage sein, die Daten zu analysieren, wie es ohne Verlust oder Verzögerung kommt.

+0

Was ist das Ziel im Wesentlichen? Könnte etwas wie Wachhund, um Änderungen an der Datei zu überprüfen, ein besserer Ansatz sein? –

+1

Sie können auch eine Sperre implementieren, so dass nur ein Prozess die Datei gleichzeitig öffnen kann. Unix kann dies auf verschiedene Arten tun http://stackoverflow.com/questions/29520587/checking-running-python-script-within-the- Python-Skript/29522672 # 29522672. Mit einem Prozess lesen und das andere Schreiben würde wahrscheinlich Sie keine Daten verlieren, aber wenn Sie die Daten verwenden, um Änderungen zu testen, erhalten Sie falsche Ausgabe –

+0

Watchdog scheinen wie ein interessantes Werkzeug zu verwenden, aber nicht das, was ich suche. Ich habe meine Frage bearbeitet, um mehr zu erklären. – Leb

Antwort

2

Eines der Skripte liest die Datei, während die andere versucht, in die Datei zu schreiben. Beide Skripts können nicht gleichzeitig auf die Datei zugreifen. Wie Padraic Cunningham in den Kommentaren sagt, können Sie eine Sperrdatei implementieren, um dieses Problem zu lösen.

Es gibt ein Python-Paket, das genau das tut lockfile mit Dokumentation here.

Hier ist Ihr erstes Skript mit dem lockfile Paket implementiert:

import pandas as pd 
from time import sleep 
import random 
from lockfile import FileLock 

df2 = pd.DataFrame(data = [['test','trial']], index=None) 
lock = FileLock('data.lock') 

while True: 
    with lock: 
     df = pd.read_csv('data.csv', header=None) 
     df.append(df2) 
     df.to_csv('data.csv', index=False) 
    sleep(random.uniform(0.025,0.3)) 

Hier ist man zweite Skript mit dem lockfile Paket implementiert:

import pandas as pd 
from time import sleep 
from lockfile import FileLock 

lock = FileLock('data.lock') 

while True: 
    with lock: 
     df = pd.read_csv('data.csv', header=None, names=['Name','DATE']) 
    print(df.shape) 
    sleep(0.100) 

ich eine Wartezeit von 100 ms, so fügte hinzu, dass ich konnte verlangsamen Sie die Ausgabe auf die Konsole.

Diese Skripte erstellen vor dem Zugriff auf die Datei "data.csv" eine Datei namens "data.lock" und löschen nach dem Zugriff auf die Datei "data.csv" die Datei "data.lock". Wenn in beiden Skripten "data.lock" vorhanden ist, wartet das Skript, bis die Datei "data.lock" nicht mehr existiert.

+0

Dies funktioniert nicht, da das erste Skript eine Simulation der Datei ist, die ständig aktualisiert wird. In Wirklichkeit kann ich nur das zweite Skript ändern/bearbeiten, wo ich nur die Datei lese – Leb

1

Ihr Simulationsskript liest und schreibt in die Datei data.csv.Sie können gleichzeitig lesen und schreiben, wenn ein Skript die Datei als schreibgeschützt öffnet und das andere die Datei schreibgeschützt öffnet.

In diesem Sinne, ich Ihre Simulation Skript zum Schreiben der Datei wie folgt geändert: nur

from time import sleep 
import random 

while(True): 
    with open("data.csv", 'a') as fp: 
     fp.write(','.join(['0','1'])) 
     fp.write('\n') 
    sleep(0.010) 

In Python, das Öffnen einer Datei mit ‚a‘ Mittel als Schreib anhängen. Die Verwendung von 'a +' wird mit Lese- und Schreibzugriff verknüpft. Sie müssen sicherstellen, dass der Code, der die Datei schreibt, die Datei nur als schreibgeschützt öffnet, und Ihr Skript, das die Datei liest, darf niemals versuchen, in die Datei zu schreiben. Andernfalls müssen Sie eine andere Lösung implementieren.

Jetzt sollten Sie lesen können mit Ihrem zweiten Skript ohne das Problem, das Sie erwähnen.