2017-01-29 1 views
0

Ich lese riesige CSV-Datei und nehme die letzte Zeile für Datum und Uhrzeit. Ich schrieb unten Code und suche nach Verbesserung oder einer optimierten Lösung.Python 3 Lesen und Schreiben von CSV-Datei und mit Dict zum Drucken Zeile

Im Anschluss an meine Daten:

2067458, XXXXXXXXXX, 1006386,100.79.94.1, XXXX4,1,0,0,1,0,1 "XXXXX", Live, "Unbekannt", Unknown , Unbekannt, Unbekannt, _ROUTER_HAS_NO_RADIO_, Unbekannt, Unbekannt, Unbekannt, Unbekannt, 2017.01.24, 16.03.43,,,,,, ,,

Dies ist mein Code

import csv 
import datetime 
import re 

input_file = 'input22.csv' 
output_file= 'temp.csv' 

def main(): 
    with open(input_file,"r") as fileHandle: 
     CSVreader = fileHandle.readlines() 
     fileHandle.close() 
     reader = CSVreader[-1] 

    with open ('temp.csv',"w") as fileHandle: 
     fileHandle.write(reader) 
     fileHandle.close() 

    with open('temp.csv') as temp_file: 
     readCSV = csv.reader(temp_file, delimiter=',') 
     for row in readCSV: 
      Date=(row[22]) 
      Time=(row[23]) 
      D=Date.strip() 
      T=Time.strip() 
      print ("{} {}".format(D,T)) 


main() 
+0

Sie können '' 'pandas''' verwenden, um den CSV direkt in einer Zeile zu lesen und eine Spalte herauszulesen. – TrigonaMinima

+0

Was versuchst du zu erreichen? – pnovotnak

Antwort

0

Einige Probleme, die ich sofort mit Ihrem Code sehe - keine Notwendigkeit, Ihre Datei zu schließen, wenn Sie sie mit einem with Block öffnen. Der Sinn von Kontext ist, dass die Datei geschlossen wird, sobald Sie den Block verlassen.

Eg;

with open ('temp.csv',"w") as fileHandle: 
    fileHandle.write(reader) 
    fileHandle.close() 

Sollte nur sein;

with open ('temp.csv',"w") as fileHandle: 
    fileHandle.write(reader) 

Das war's! Python übernimmt das Schließen der Datei für Sie.

Als nächstes verwenden Sie nicht fh.readlines(). Das liest die ganze Datei in den Speicher und kann Ihren Computer zum Absturz bringen, wenn die Datei zu groß ist, um in den Speicher zu passen. Stattdessen iterate over the file, as per the documentation. In diesem Zusammenhang sieht das so aus;

with open(input_file, "r") as fileHandle: 
    CSVreader = csv.reader(fileHandle) 
    for row in CSVreader: 
     # do something with the row 

Python puffert Ihre Lesevorgänge automatisch und behält nur einen kleinen Teil der Datei gleichzeitig im Speicher. Randnotiz: Wie Sie es gerade haben, lesen Sie die gesamte Datei in CSVreader, die eigentlich nur rows oder so genannt werden sollte, da dies nicht ein reader Objekt ist.

Schließlich muss der Modus in der ersten Instanz nicht an den Aufruf open() übergeben werden - Sie können dieselbe Syntax verwenden, die Sie beim zweiten Öffnen von temp.csv verwenden.

Ich glaube, dass dieses (ungeprüfte) Snippet das Gleiche wie Ihres erreicht, ein wenig prägnanter und effizienter.

import csv 
import datetime 
import re 

input_file = 'input22.csv' 
output_file= 'temp.csv' 

def main(): 
    last = list() # scope this variable so that we may use it after the files have been closed 
    with open(input_file) as input_fh, \ 
      open('temp.csv', 'w') as output_fh: 
     reader = csv.reader(input_fh) 
     writer = csv.writer(output_fh) 
     # discard everything except the last line of output 
     for row in reader: 
      last = row 
     writer.write(last) 

    # print that last row with formatting 
    D=last[22].strip() 
    T=last[23].strip() 
    print ("{} {}".format(D,T)) 

main() 
+0

Danke für den Code, Sie bringen mein Hauptanliegen hervor, ganze Zeilen in 1 Variable aufzufüllen. Der folgende Code funktioniert mit writer.writerows (last). –

Verwandte Themen