陷入python中的while循环

时间:2017-12-06 21:53:20

标签: python loops csv while-loop

我对python很新,所以请耐心等待。我有下面的代码,我已插入一个while循环,以确保每次给出一个名称,它检查以验证名称是在csv中,然后如果不是它给出和错误,并要求一个新的名称。我的问题是我似乎无法摆脱循环。即使有一个新名称,我知道的事实是在csv中它仍然坚持循环。我的问题是如何让这段代码运行循环并验证名称在那里?任何帮助都会很棒。如果有更好的方法来写这个,我甚至愿意改变整个代码。

这是我得到的:

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')

这是我输入时的结果: 仅供参考。史蒂夫米勒不在csv文件中,所以第一反应是正确的。但是,Sri Mantri在文件中,它应该继续并打印出她名下的所有列表。

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

以下是代码运行时输出的样子。

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

并且csv看起来像这样:

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

3 个答案:

答案 0 :(得分:2)

你在while循环中要求输入,它永远不会检查除当前行之外的任何行。看起来你正试图遍历整个列表以查看名称是否在那里(这是粗略的性能明智但我不会因为进入xD而迷惑你)所以你的输入检查和循环需要像这样移动:

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')

答案 1 :(得分: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')

答案 2 :(得分:1)

假设文件可以有多行与给定的全名相关,请尝试类似:

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