2017-04-11 4 views
1

Derzeit arbeite ich an einem CSV-Dateiprogramm, wo ich die CSV-Datei in nicht überlappende Teile (zeilenweise) partitionieren muss, aber keine zusätzlichen Dateien auf der Festplatte erstellen soll.CSV-Datei Zeile inkrementieren

Derzeit dieses Programm verwende ich bestimmte Teile der CSV-Datei zeilenweise zu lesen: 0-4

def dataFromFile(fname): 
    record = [] 
    count=0 
    with open(fname, 'rb') as f: 
     reader = csv.reader(f) 
     for row in reader: 
      while '' in row: 
        row.remove('') 
      count+=1 
      record.append(row) 
    print count 
    return record[0:4] 

Hier bin ich in der Lage zu lesen, um die Zeilen innerhalb des Bereichs. Aber gibt es eine Möglichkeit, dies zu automatisieren, d. H. Können wir, ohne diesen Bereich manuell jedes Mal lesen die nächsten 4 Zeilen und so weiter bis zum Ende der CSV-Datei?

Die CSV-Datei enthält:

apple beer rice chicken 
apple beer rice  
apple beer   
apple mango  
milk beer rice chicken 
milk beer rice  
milk beer   
milk mango  
+0

Können Sie ein konkretes Beispiel für die Eingabe der CSV-Datei und das erwartete Ergebnis angeben? – mkrieger1

+0

Was soll die Behandlung von '' 'bedeuten? – mkrieger1

+0

@ mkrieger1 '' sind die leeren Felder in der Liste. Die Beispiel-CSV-Datei enthält Transaktionsdaten eines Marktes ohne Labels oder Header. – Knox

Antwort

1

Sie yield verwenden können:

def dataFromFile(fname): 
    record = [] 
    print'Opening the file is executed once' 
    count = 0 
    with open(fname) as f: 
     for row in csv.reader(f, delimiter=' '): 
      count += 1 
      fields = [field for field in row if field] 
      if fields: 
       record.append(fields) 
      if len(record) == 4: 
       print 'Last yielded row:', count 
       yield(record) 
       record = [] 
    if record: 
     yield record 

Und der Anruf:

for row in dataFromFile('your.csv'): 
    print row 

Vom Dolmetscher

>>> import csv 
>>> 
>>> def dataFromFile(fname): 
    record = [] 
    print 'Opening the file is executed once' 
    count = 0 
    with open(fname) as f: 
     for row in csv.reader(f, delimiter=' '): 
      count += 1 

      fields = [field for field in row if field] 
      if fields: 
       record.append(fields) 
      if len(record) == 4: 
       print 'Last yielded row:', count 
       yield(record) 
       record = [] 
    if record: 
     yield record 
... 
>>> for row in dataFromFile('your.csv'): 
...  print row 
... 
Opening the file is executed once 
Last yielded row: 4 
[['apple', 'beer', 'rice', 'chicken'], ['apple', 'beer', 'rice'], ['apple', 'beer'], ['apple', 'mango']] 
Last yielded row: 8 
[['milk', 'beer', 'rice', 'chicken'], ['milk', 'beer', 'rice'], ['milk', 'beer'], ['milk', 'mango']] 
>>> 
+0

Danke für die Hilfe. Aber ich möchte die ersten 4 Zeilen nicht mehr lesen, nachdem ich sie einmal gelesen habe. Ich benutze diese ersten 4 Zeilen als Eingabe für ein Programm. Ich möchte sie ausschließen, die nächsten 4 Zeilen lesen, sie in das Programm eingeben und das Gleiche für die nächste Anzahl von Zeilen tun. – Knox

+0

Ich bin nicht so vertraut mit Generatoren. Ich werde es mir ansehen. Vielen Dank. – Knox

+0

record = [] erstellt den Datensatz als Liste. Aber Ertrag arbeitet nicht mit Liste. – Knox