2017-12-06 4 views
-1

Ich bin sehr neu zu Python so mit mir zu tragen. Ich habe diesen Code, unter dem ich eine while-Schleife eingefügt habe, um sicherzustellen, dass jedes Mal, wenn ein Name angegeben wird, überprüft, ob der Name in der CSV ist und wenn nicht, gibt es einen Fehler und fragt nach einem neuen Namen. Mein Problem ist, dass ich nicht aus der Schleife herauskommen kann. Selbst mit einem neuen Namen, den ich wirklich kenne, ist er in der CSV immer noch in der Schleife. Meine Frage ist, wie kann ich diesen Code erhalten, um durch eine Schleife zu laufen und zu überprüfen, dass der Name dort ist? Jede Hilfe wäre großartig. Ich bin sogar offen, den gesamten Code zu ändern, wenn es eine bessere Möglichkeit gibt, dies zu schreiben.Stuck in einer While-Schleife in Python

Hier ist, was ich habe:

import csv 

full_name = input('Enter your full name: ').lower() 

with open('Report1.csv') as csvfile: 
    hour_summation = {} 
    read_csv = csv.reader(csvfile, delimiter=',') 
    for row in read_csv: 
     while (' '.join((row[0], row[1]))).lower() != full_name.strip().lower(): 
      print('Name is not in system') 
      full_name = input('Enter your full name: ').lower() 
     if(' '.join((row[0], row[1]))).lower() == full_name.strip().lower(): 
      hour_summation[row[2]] = hour_summation.get(row[2], 0) + int(float(row[3])) 
print('This is {} full hours report:'.format(full_name)) 
for k, v in hour_summation.items(): 
    print(k + ': ' + str(v) + ' hours') 

Hier das Ergebnis ist, wenn ich einen Eingang geben: FYI. Steve Miller ist nicht in der CSV-Datei, so dass die erste Antwort korrekt ist. Allerdings ist Sri Mantri in der Datei und es sollte weitergehen und alle Einträge unter ihrem Namen ausdrucken.

Enter your full name: Steve Miller 
Name is not in system 
Enter your full name: Sri Mantri 
Name is not in system 

So sollte die Ausgabe aussehen, wenn der Code ausgeführt wird.

Enter your full name: Sri mantri 
This is sri mantri full hours report: 
Beeline Blank: 28 hours 
SRV-0001 Service Requests for Base and Direct Services: 4 hours 
SUP-0001 Support Requests with a CISM Ticket: 129 hours 
SUP-2503 Web Application Maintenance & Support: 72 hours 
0026184229 Margin Controlling Java Rewrite: 4 hours 
0033472751 PRE-AFE 2017 - CMS Enhancements: 2 hours 
0033472863 PRE-AFE 2017 - BPM Enhancements: 67 hours 
APP-10008 Pre-Series (Non-Mainframe): 4 hours 
APP-10146 Logistics (Non-Mainframe): 3 hours 
APP-10195 Vehicle Labor System (Mainframe): 3 hours 
APP-10354 Web PartsPro (Non-Mainframe): 1 hours 
APP-10431 VIPService (Non-Mainframe): 1 hours 
APP-10432 VIPService (Mainframe): 3 hours 
APP-10536 Truck Invoice Adjustments (Mainframe): 2 hours 

und die csv wie folgt aussieht:

First Name Last Name Activity Hours 
Sri Mantri SUP-2503 Web Application Maintenance & Support 11 
Sri Mantri SUP-2503 Web Application Maintenance & Support 3 
Sri Mantri SUP-2503 Web Application Maintenance & Support 5 
Sri Mantri SUP-2503 Web Application Maintenance & Support 2 
Jeff Moore SUP-2503 Web Application Maintenance & Support 3 
David Ayers SUP-2507 NAFTA MFTS OS Support 10 
Prasanth Musunuru 0020826809 Vertex 6.0 at the NDC 4 
Prasanth Musunuru 0020826809 Vertex 6.0 at the NDC 3 
Prasanth Musunuru 0020826809 Vertex 6.0 at the NDC 1 
Prasanth Musunuru 0020826809 Vertex 6.0 at the NDC 1 
Jeff Moore 0024480049 Fuel Tanks (infrastructure) - time tracking 1 
Jeff Moore 0024480049 Fuel Tanks (infrastructure) - time tracking 1 
Jeff Moore 0024480049 Fuel Tanks (infrastructure) - time tracking 4 
+0

die 'while'-Schleife mit dem zweiten' input' befindet sich innerhalb der for-Schleife, so dass nur die aktuell bearbeitete Zeile betrachtet wird. –

+0

Also denkst du, ich sollte die for-Schleife im Allgemeinen entfernen? – stevenmiller

+0

@stevenmiller Ihre CSV-Datei enthält keine Kommas. – Goyo

Antwort

2

Sie sind für die Eingabe in der while-Schleife zu stellen, die nie die aktuelle Zeile eine Zeile andere prüft dann. Es sieht so aus, als ob du versuchst, über die gesamte Liste zu iterieren, um zu sehen, ob der Name irgendwo da ist (was eine grobe Leistung ist, aber ich werde dich nicht verwirren, indem du in diese xD kommst), also müssen deine Eingabe-Checks und Loops sein um ein bisschen bewegt wie so:

import csv 

with open('Report1.csv') as csvfile: 
    hour_summation = {} 
    read_csv = csv.reader(csvfile, delimiter=',') 
    name_found = False 
    while not name_found: 
    # take user input for name 
    full_name = input('Enter your full name: ').lower() 
    # start search at top of file. Have to do this or each loop will 
    # start at the end of the file after the first check. 
    csvfile.seek(0) 
    for row in read_csv: 
     # check to see if row matches name 
     if(' '.join((row[0], row[1]))).lower() == full_name.strip().lower(): 
     name_found = True 
     hour_summation[row[2]] = hour_summation.get(row[2], 0) + int(float(row[3])) 

    # name wasn't found, so repeat process 
    if not name_found: 
     # name wasn't found, go back to start of while loop 
     print('Name is not in system') 
    else: 
     # break out of while loop. Technically not required since while 
     # will exit here anyway, but clarity is nice 
     break 

print('This is {} full hours report:'.format(full_name)) 
for k, v in hour_summation.items(): 
    print(k + ': ' + str(v) + ' hours') 
+0

Das ist wirklich nah an dem, was ich brauche, aber es druckt nur die erste Zeile des csv, die mit dem Benutzernamen verknüpft ist. Ich versuche, einen vollen Stundenbericht von diesem Namen zu bekommen. – stevenmiller

+0

@stevenmiller Yeah ich vermasselt. Ich habe gerade eine Zeile entfernt, die eigentlich nicht da sein sollte. Ich hatte eine extra Pause, die die for-Schleife zu früh brach. Überprüfen Sie die Bearbeitung und versuchen Sie es erneut. Sollten Sie jede Zeile mit diesem Namen bekommen. – MCBama

+0

Du hast es gerockt, mein Mann! Genau das habe ich gesucht. Wenn ich nur sicherstellen könnte, dass falsch geschriebene Namen vermieden werden können. lol – stevenmiller

1
import csv 

full_name = input('Enter your full name: ').lower() 
bucle = True 
with open('Report1.csv') as csvfile: 
    hour_summation = {} 
    read_csv = csv.reader(csvfile, delimiter=',') 
    while bucle:  
     for row in read_csv: 
      if(' '.join((row[0], row[1]))).lower() == full_name.strip().lower(): 
       hour_summation[row[2]] = hour_summation.get(row[2], 0) + int(float(row[3])) 
       bucle = False 
     if bucle: 
      print('Name is not in system') 
      full_name = input('Enter your full name: ').lower() 
      csvfile.seek(0) 

print('This is {} full hours report:'.format(full_name)) 
for k, v in hour_summation.items(): 
print(k + ': ' + str(v) + ' hours') 
+1

Dies funktioniert nicht, ohne die Datei nach oben zu suchen. 'csv.reader' gibt keine Liste oder etwas zurück, das einfach wiederholt werden kann. – MCBama

+0

Ok, danke, bearbeite Antwort. – Manuel

+0

Es funktioniert jetzt aber nur 1x durch die Schleife und dann raus Fehler. – stevenmiller

1

die Datei unter der Annahme des gegebenen vollständigen Namen im Zusammenhang mehr Zeilen haben kann, versuchen Sie so etwas wie:

import csv 

full_name = input('Enter your full name: ').lower() 
run=1 
while run:  
    with open('Report1.csv') as csvfile: 
     hour_summation = {} 
     read_csv = csv.reader(csvfile, delimiter=',') 
     for row in read_csv: 
      if(' '.join((row[0], row[1]))).lower() == full_name.strip().lower(): 
       hour_summation[row[2]] = hour_summation.get(row[2], 0) + int(float(row[3])) 

    if hour_summation: 
     print('This is {} full hours report:'.format(full_name)) 
     for k, v in hour_summation.items(): 
      print(k + ': ' + str(v) + ' hours') 
     run=0 
    else: 
     print('Name is not in system') 
     full_name = input('Enter your full name: ').lower() # following your code, 
                  # request for a new full name comes only in case no results for the 1st one 
+0

Das funktioniert gut, außer die Schleife ist nur gut für einen Fehler. Also, wenn ich zwei Namen in einer Reihe eingeben, die nicht in der CSV sind, funktioniert es nur 1 Mal und stoppt dann. – stevenmiller

+0

Ich habe die obere Schleife hinzugefügt, also wird nach dem Namen gefragt, bis er einen gültigen bekommt, danach hört er auf. Die Logik und der Code können je nach Anforderungen unterschiedlich sein. – cur4so

+0

Nette Arbeit. Auch dies ist eine großartige Lösung. – stevenmiller

Verwandte Themen