2017-03-22 1 views
0

ich Datendateien wie folgt aussieht:Python & Pandas: Wie kann ich das Erstellen von Zwischendateien beim Lesen von Daten überspringen?

ABE200501.dat 
ABE200502.dat 
ABE200503.dat 
... 

Also zunächst kombiniert ich diese Dateien in all.dat und reinigen ein wenig

fout=open("all.dat","w") 
for year in range(2000,2017): 
    for month in range(1,13): 
     try: 
      for line in open("ABE"+ str(year) +"%02d"%(month)+".dat"): 
       fout.write(line.replace("[", " ").replace("]", " ").replace('"', " ").replace('`', " ")) 
     except: 
      pass 
fout.close() 

Und ich las später die endgültige Datei in Pandas

df = pd.read_csv("all.dat", skipinitialspace=True, error_bad_lines=False, sep=' ', 
        names = ['stationID','time','vis','day_type','vis2','day_type2','dir','speed','dir_max','speed_max','visual_range', 'unknown']) 

Ich möchte wissen, wenn es möglich ist, kombinieren Dateien direkt im RAM statt auf meiner Festplatte zu speichern? Dies kann mir viel unnötigen Platz sparen.

Danke!

Antwort

1

Mit dem Modul StringIO können Sie Strings als Dateien behandeln.

Beispiel aus der Dokumentation:

import StringIO 

output = StringIO.StringIO() 
output.write('First line.\n') 
print >>output, 'Second line.' 

# Retrieve file contents -- this will be 
# 'First line.\nSecond line.\n' 
contents = output.getvalue() 

# Close object and discard memory buffer -- 
# .getvalue() will now raise an exception. 
output.close() 

Für Ihren eigenen Code:

fout = StringIO.StringIO() 
# treat fout as a file handle like usual 
# parse input files, writing to fout 

file = fout.getvalue() # file is kind of a virtual file now 
         # and can be "opened" by StringIO 
fout.close() 

# ... 

using StringIO.StringIO(file) as fin: 
    df = pd.read_csv(fin, skipinitialspace=True, error_bad_lines=False, sep=' ', names = ['stationID','time','vis','day_type','vis2','day_type2','dir','speed','dir_max','speed_max','visual_range', 'unknown']) 

Pandas akzeptiert beide Pfadname Strings und Datei-Handles als Eingabe.

+0

Das ist cool! Eine Frage, es scheint, als wäre es in Python 2, gibt es etwas, worüber ich mich kümmern muss? – cqcn1991

+0

@ cqcn1991 Python3 verwendet stattdessen 'io', wie in:' io.StringIO'. In-Memory-Streams werden über [hier] (https://docs.python.org/3/library/io.html#in-memory-streams) diskutiert. – Ouroborus

Verwandte Themen