2016-06-09 9 views
1

Unten ist ein Ausschnitt aus einer CSV-Datei. Die erste Spalte ist die Produktnummer, 2 der Lagerbestand ist, 3 ist der Zielpegel ist, und 4 ist der Abstand vom Ziel (Ziel minus Bestand.)Zeichenfolge ersetzen für mehrere Zeilen in einer CSV

34512340,0,95,95 
12395675,3,95,92 
56756777,70,95,25 
90673412,2,95,93 

Wenn der Lagerbestand bis 5 bekommt oder unter Ich möchte die Lagerbestände von Python aktualisiert haben, wenn ein Benutzer es anfordert.

Ich benutze derzeit diesen Code, den ich von nur einer Zeile in der CSV-Datei angepasst habe. Es funktioniert aber nicht. Die erste Zeile wird als 34512340,0,95,95 in die Datei geschrieben und der Rest der Datei wird gelöscht.

choice = input("\nTo update the stock levels of the above products, type 1. To cancel, enter anything else.") 
if choice == '1': 
    with open('stockcontrol.csv',newline='') as f: 
     for line in f: 
      data = line.split(",") 
      productcode = int(data[0]) 
      target = int(data[2]) 
      stocklevel = int(data[1]) 
      if stocklevel <= 5: 
       target = str(target) 
       import sys 
       import csv 
       data=[] 
       newval= target 
       newtlevel = "0" 
       f=open("stockcontrol.csv") 
       reader=csv.DictReader(f,fieldnames=['code','level', 'target', 'distancefromtarget']) 
       for line in reader: 
        line['level']= newval 
        line['distancefromtarget']= newtlevel 
        data.append('%s,%s,%s,%s'%(line['code'],line['level'],line['target'],line['distancefromtarget'])) 
        f.close() 
        f=open("stockcontrol.csv","w") 
        f.write("\n".join(data)) 
        f.close() 
        print("The stock levels were updated successfully") 
else: 
    print("Goodbye") 

Hier ist der Code, den ich eine Zeile in der CSV-Datei zu ändern hatte und arbeitet:

with open('stockcontrol.csv',newline='') as f: 
      for line in f: 
       if code in line: 
        data = line.split(",") 
        target = (data[2]) 
    newlevel = stocklevel - quantity 
    updatetarget = int(target) - int(newlevel) 
    stocklevel = str(stocklevel) 
    newlevel = str(newlevel) 
    updatetarget = str(updatetarget) 
    import sys 
    import csv 

    data=[] 
    code = code 
    newval= newlevel 
    newtlevel = updatetarget 
    f=open("stockcontrol.csv") 
    reader=csv.DictReader(f,fieldnames=['code','level', 'target', 'distancefromtarget']) 
    for line in reader: 
     if line['code'] == code: 
     line['level']= newval 
     line['distancefromtarget']= newtlevel 
     data.append('%s,%s,%s,%s'%(line['code'],line['level'],line['target'],line['distancefromtarget'])) 
    f.close() 

    f=open("stockcontrol.csv","w") 
    f.write("\n".join(data)) 
    f.close() 

Was kann ich den Code Arbeit machen ändern? Ich möchte grundsätzlich, dass das Programm jede Zeile der CSV-Datei durchläuft, und wenn der Lagerbestand (Spalte 2) gleich oder kleiner als 5 ist, den Lagerbestand auf die Zielnummer in Spalte 3 aktualisieren und dann die Anzahl einstellen Spalte 4 auf Null.

Danke,

+0

@SilentMonk bitte können Sie diese Frage betrachten –

+0

Entschuldigung, ja, es hat @SilentMonk –

Antwort

1

Der Code unten jede Zeile liest und überprüft den Wert der Spalte 2. Wenn es weniger als oder gleich 5 ist, wird der Wert von column2 auf dem Wert der column3 und letzte Spalte geändert wird geändert Sonst sind alle Spalten unverändert.

import sys 
import csv 

data=[] 
f=open("stockcontrol.csv") 
reader=csv.DictReader(f,fieldnames=['code','level','target','distancefromtarget']) 
for line in reader: 
    if int(line['level']) <= 5: 
    line['level']= line['target'] 
    line['distancefromtarget']= 0 
    data.append("%s,%s,%s,%s"%(line['code'],line['level'],line['target'],line['distancefromtarget'])) 
f.close() 


f=open("stockcontrol.csv","w") 
f.write("\n".join(data)) 
f.close() 

kommend auf Fragen im Code:

Sie die Datei zuerst zu lesen, ohne das csv-Modul und die Werte in jeder Spalte immer durch die Linie zu splitten. Sie verwenden wieder die DictReader Methode von csv Modul, um die Werte zu lesen, die Sie bereits hatten.

Verwandte Themen