2011-04-13 43 views
0

我一直在尝试编写此代码的不同方式,但无法通过此操作。目前该程序将一直运行到write_names(list)函数并创建文件,打印功能将打印排序列表。该程序拒绝获取search_names()函数的用户输入,但它会打印我要求的任何内容。即使打印函数正在打印列表,但在Python中读取文件错误

调试亮点:while index < len(list)并且在调试I \ O中只声明“读取文件错误”。希望有人知道我做错了什么。

'# Abstract:  This program creates a list of names. The list is printed, 
'#    sorted, printed again, written to file, and searched. 
'#============================================================================= 

'#define the main function 

def main(): 

    #try: 
     ##open data file for read 
     #infile = open('names.txt', 'r') 

    #call get_names function 
    list = get_names() 

    #call print function 
    print_names(list) 

    #sort list 
    list.sort() 

    #print sorted list 
    print_names(list) 

    #write sorted list to new file 
    write_names(list) 

    #allow user to search list 
    search_names(list) 



def get_names(): 

    try: 
     infile = open('names.txt', 'r') 
     #read file contents into a list 
     list = infile.readlines() 
     #close file 
     infile.close() 
     #strip \n from each element 
     index = 0 
     while index < len(list): 
      list[index] = list[index].rstrip('\n') 
      index += 1 
     return list 
    except IOError: 
     print 'Read file error' 

def print_names(list): 

    #print header 
    print '******************' 
    #print list line by line 
    index = 0 
    while index < len(list): 
     print list[index] 
     index += 1 
    return 

def write_names(list): 

    #open file for writing 
    outfile = open('sortedNames.txt', 'w') 
    #write the list to the file 
    for item in list: 
     outfile.write(str(item) + '\n') 
    #close file 
    outfile.close() 

def search_names(list): 

    #set user test variable 
    again = 'Y' 
    while again.upper == 'Y': 
     #get search from user 
     search = raw_input('Enter a name to search for: ') 
     #open list for search 
     if search in list: 
      try: 
       item_index = list.index(search) 
       print search, 'found.', item_index 
      except ValueError: 
       print search, 'not found.' 



main() 
' 

在此先感谢!

+3

我建议不要使用“list”,因为它是一个内置函数。 – aukaost 2011-04-13 23:42:27

回答

1

你的问题是upper是一个函数,你不是在调用它。您在search_names()while应改为:

while again.upper() == 'Y': 
0

代替:

#strip \n from each element 
index = 0 
while index < len(list): 
    list[index] = list[index].rstrip('\n') 
    index += 1 
return list 

只是使用这个列表理解:

lines = infile.readlines() 
infile.close() 

return [ line.strip() for line in lines ] 

编辑:

它看起来像您使用的是索引和一个while循环可以使用一个for环路。

相反的:

while index < len(list): 
    print list[index] 
    index += 1 

使用:

# using name_list instead of list 
    for name in name_list: 
     print name 

也,你search_names()函数如下缺陷:

def search_names(list): 

    #set user test variable 
    again = 'Y' 
    while again.upper == 'Y': 
     #get search from user 
     search = raw_input('Enter a name to search for: ') 
     #open list for search 
     if search in list: 
      try: 
       item_index = list.index(search) 
       print search, 'found.', item_index 
      except ValueError: 
       print search, 'not found.' 

永远不会退出(又从不重新分配)。尝试:

def search_names(names_list): 
    again = 'Y' 
    while again.upper() == 'Y': 
     s_name = raw_input('Enter a name to search for: ') 
     if s_name in names_list: 
      print s_name, 'found.', names_list.index(s_name) 
     else: 
      print search, 'not found.' 
     again = raw_input('Search for another name (Y|N)?: ') 

或:

def search_names(names_list): 
    again = 'Y' 
    while again == 'Y': 
     s_name = raw_input('Enter a name to search for: ') 
     try: 
      idx = names_list.index(s_name) 
      print s_name, 'found.', idx 
     except ValueError: 
      print search, 'not found.' 
     again = raw_input('Search for another name (Y|N)?: ').upper() 

这带来了的时候捕捉异常VS使用if语句的问题:

msdn

的方法你选择取决于你期望事件发生的频率如何。 如果事件确实例外,并且 是错误(例如意外的 文件结束),则使用异常处理 更好,因为在正常情况下执行的代码少于 。如果 事件经常发生,使用 编程方法检查 错误会更好。在这种情况下,如果发生异常,则例外将会花费更长的时间处理。

0
  1. 评论开始#,不'# - 你在做你的头一个文档字符串的所有其他行。

  2. 您正在使用索引遍历列表,效率低下 - 只是迭代列表项。

  3. 调用变量list是不好的,因为它阻止您访问list()数据类型。

  4. 使用with是开放的().. close()方法更可靠的替代

  5. again.upper是一个函数参考 - 你必须通话的功能,即again.upper()

  6. 你永远不会改变again的值 - 这将是一个无限循环!

  7. 您测试if search in list但后来做了try..except块,如果它是不列表(即你正在测试为同一故障两次)这只会失败。

# 
# Operate on a list of names 
# 

def load_names(fname): 
    try: 
     with open(fname, 'r') as inf: 
      return [line.strip() for line in inf] 
    except IOError: 
     print "Error reading file '{0}'".format(fname) 
     return [] 

def print_names(namelist): 
    print '******************' 
    print '\n'.join(namelist) 

def write_names(namelist, fname): 
    with open(fname, 'w') as outf: 
     outf.write('\n'.join(namelist)) 

def search_names(namelist): 
    while True: 
     lookfor = raw_input('Enter a name to search for (or nothing to quit): ').strip() 
     if lookfor: 
      try: 
       ind = namelist.index(lookfor) 
       print("{0} found.".format(lookfor)) 
      except ValueError: 
       print("{0} not found.".format(lookfor)) 
     else: 
      break 

def main(): 
    namelist = load_names('names.txt') 
    print_names(namelist) 
    namelist.sort() 
    print_names(namelist) 
    write_names(namelist, 'sorted_names.txt') 
    search_names(namelist) 

if __name__=="__main__": 
    main()