在手动编写一个 FTP 时, 需要编写一个函数用来选择文件, 返回文件路径.
这里选择了递归函数进行一次性的取值.
- import os
- def choose_file():
- while True:
- current_path = os.getcwd()
- path_list = os.listdir(current_path)
- for index,name in enumerate(path_list,1):
- print(index,name)
- choice = input('请输入您的选择, 按 0 返回上一级 >>>:').strip()
- if choice == '0':
- os.chdir(os.pardir)
- choose_file()
- # return
- if not choice.isdigit():
- print('请输入数字')
- continue
- choice = int(choice) - 1
- if choice not in range(0,len(path_list)):
- print('请输入正确的编号')
- continue
- path_name = path_list[choice]
- path = os.path.join(current_path,path_name)
- if os.path.isdir(path_name):
- os.chdir(path_name)
- choose_file()
- else:
- print(path)
- return path,path_name
- choose_file()
问题在于, 当我执行到了非文件夹的文件后, 返回到了路径值, 但是并没有结束选择目录, 继续让我选择.
于是我又选了一遍, 发现又让我选择...(啥毛病)
后来总结了一下, 发现只要切换了目录就会让我多选择一次.
这样的话肯定是因为递归的问题了, 在我进入下一次的递归时, 上一个递归的 while 循环还没有结束, 结束条件只要 return, 所以会返回很多的返回值.
解决方案:
1, 一次性结束递归.
2. 设置一个全局变量, 当条件达成时值为 False, 否则值为 True. 在函数开头写上结束语句的条件.
3. 只要一拿到值, 就返回该值, 上一层函数在返回该值, 层层接力到最外层的函数.
第一个实在想不出来有什么方法, 暂且放弃思考.
第二个方法实践后变成了这样. 不太行, 因为, while 循环内部的数据传不出去, 只能通过 return 结束 while 中的函数.
- import os
- isgo = True
- def choose_file():
- global isgo
- if isgo ==False:
- return
- while True:
- current_path = os.getcwd()
- path_list = os.listdir(current_path)
- for index,name in enumerate(path_list,1):
- print(index,name)
- choice = input('请输入您的选择, 按 0 返回上一级 >>>:').strip()
- if choice == '0':
- os.chdir(os.pardir)
- choose_file()
- return
- if not choice.isdigit():
- print('请输入数字')
- continue
- choice = int(choice) - 1
- if choice not in range(0,len(path_list)):
- print('请输入正确的编号')
- continue
- path_name = path_list[choice]
- path = os.path.join(current_path,path_name)
- if os.path.isdir(path):
- os.chdir(path)
- choose_file()
- return
- else:
- # print(path)
- isgo = False
- return path,path_name
- print(choose_file())
- # choose_file()
第三个方法:
- import os
- def choose_file():
- while True:
- current_path = os.getcwd()
- path_list = os.listdir(current_path)
- for index,name in enumerate(path_list,1):
- print(index,name)
- choice = input('请输入您的选择, 按 0 返回上一级 >>>:').strip()
- if choice == '0':
- os.chdir(os.pardir)
- return choose_file()
- if not choice.isdigit():
- print('请输入数字')
- continue
- choice = int(choice) - 1
- if choice not in range(0,len(path_list)):
- print('请输入正确的编号')
- continue
- path_name = path_list[choice]
- path = os.path.join(current_path,path_name)
- if os.path.isdir(path):
- os.chdir(path)
- return choose_file()
- else:
- # print(path)
- # isgo = False
- return path,path_name
- print(choose_file())
注意, 这种方法每一次调用函数时, 只能加括号一次, 否则就会反复运行程序.
所以得出结论:
1. 没事别写死循环, 把 while 加一个判断条件应该可以实现第二种方法.
2. 递归里面就不要 加 while 了. 又要考虑 while 循环体, 又要考虑递归循环题, 两个终止条件还不能一起存在.
来源: http://www.bubuko.com/infodetail-3157004.html