鱼C论坛

 找回密码
 立即注册
查看: 1913|回复: 1

[技术交流] 《零基础入门学习python》第35讲课后练习

[复制链接]
发表于 2017-11-14 19:26:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 铁棍阿童木 于 2017-11-14 19:30 编辑

动动手 3:打开指定的文件,并显示到textbox()  如果文件发生改变让用户选择覆盖保存、放弃保存、另存为。

确实卡了很久,我用的办法是用strip()方法去掉字符串前后所有的"\n",然后再比较。

  1. # 提供一个文件夹浏览框,让用户选择需要打开的文本文件,打开并显示文件内容
  2. import easygui as g
  3. import os


  4. def search_TXT_file(obj_dir):
  5.     if os.path.isdir(obj_dir):
  6.         os.chdir(obj_dir)
  7.         for each in os.listdir(os.curdir):
  8.             if os.path.isfile(each):
  9.                 (f_name,f_exte) = os.path.splitext(each)
  10.                 if f_exte == ".txt":
  11.                     file_path = os.getcwd() + os.sep + each
  12.                     path_list.append(file_path)
  13.             if os.path.isdir(each):
  14.                 search_TXT_file(each)
  15.                 os.chdir(os.pardir)

  16. obj_dir = os.curdir
  17. path_list = []
  18. search_TXT_file(obj_dir)
  19. openfile = g.choicebox(msg="请选择要打开的文本文件",choices=path_list)

  20. with open(openfile) as file_obj:
  21.     content = file_obj.read()
  22. choice = g.textbox(msg="文件【%s】的内容如下" % openfile,title="显示文件内容",text=content)

  23. # 将从文件对象中读取到的内容和textbox()返回的内容前后所有的“\n”去掉,方便比对
  24. choice = choice.strip("\n")
  25. content = content.strip("\n")


  26. msg = "检测到文件内容发生改变,请选择以下操作:"
  27. title = "警告"
  28. choices = ("覆盖保存","放弃保存","另存为...")
  29. if choice != content:
  30.     user_option = g.buttonbox(msg,title,choices)
  31.     if user_option == "覆盖保存":
  32.         with open(openfile,"w") as temp_obj:
  33.             temp_obj.write(choice)
  34.     if user_option == "放弃保存":
  35.         pass
  36.     if user_option == "另存为...":
  37.         new_path = g.filesavebox("请选择要保存的位置","另存为",default=".txt")
  38.         if os.path.splitext(new_path)[1] != ".txt":
  39.             new_path += ".txt"
  40.             with open(new_path,"w") as new_file:
  41.                 new_file.write(choice)
复制代码



动动手 4:统计指定文件夹中特定源代码文件数量和代码行数,我这里做了过滤处理,代码行数将空行全部过滤了。
感觉函数式编程还是省事很多,我最开始用的方法就是本办法,每种后缀搜索一次,保存一次,最后累加。代码量超过200行。哈哈哈
流水分工式设计还是简洁多了。
  1. # 找到指定目录下所有[.py   .c   .cpp   .pas   .asm   .cc   .java]源文件
  2. # 统计每种源文件的个数和源代码行数
  3. # 最后计算总的代码行数,并显示以10万行为目标的进度百分比;
  4. import easygui as g
  5. import os
  6. """
  7. 定义一个search_file()函数,根据用户选择,找到目标文件夹下所有符合条件的源代码文件
  8. ----根据diropenbox()返回的路径搜索文件夹
  9. --------将指定文件夹变为工作目录
  10. --------列出当前文件夹下所有文件
  11. ------------如果search到的是文件
  12. ----------------用os.path.splitext()方法将文件名和扩展名分离
  13. ----------------如果文件扩展名在扩展名列表中 in ext_list:
  14. --------------------调用calculation()计算代码行数
  15. --------------------将file_quantity_dict字典中对应的键值 += 1(文件计数)
  16. --------------------同时根据Calculated()函数的返回值将对应字典中相关扩展名的键值 += 1(代码行数累加)
  17. """
  18. def search_file(specified_folder):
  19.     os.chdir(specified_folder)
  20.     for each_file in os.listdir(os.curdir):
  21.         if os.path.isfile(each_file):
  22.             ext = os.path.splitext(each_file)[1]
  23.             if ext in ext_list:
  24.                 lines = calculation(each_file)
  25.                 try:
  26.                     file_quantity_dict[ext] += 1
  27.                 except KeyError:
  28.                     file_quantity_dict[ext] = 1

  29.                 try:
  30.                     code_quantity_dict[ext] += lines
  31.                 except KeyError:
  32.                     code_quantity_dict[ext] = lines
  33.         if os.path.isdir(each_file):
  34.             search_file(each_file)
  35.             os.chdir(os.pardir)

  36. """
  37. 定义一个Calculated()函数,返回源文件中的代码行数
  38. ----当search_file()函数传递来的路径打开指定文件
  39. ----从文件中每读取一行,计数器累计 + 1(过滤空行,使得代码量更加真实)
  40. ----并向code_quantity_dict字典中相应的键值+=1(行计数)
  41. ----完成后返回行数;

  42. """
  43. def calculation(source_file):
  44.     lines = 0
  45.     with open(source_file,encoding="utf-8") as f:
  46.         for each_row in f:
  47.             if each_row == "\n":
  48.                 continue
  49.             else:
  50.                 lines += 1
  51.     return lines

  52. """
  53. 定义一个print_result()函数,显示统计结果
  54. ----从file_quantity_dict字典中迭代出扩展名数据
  55. ----从code_quantity_dict字典中迭代出代码行数据并进行累加得到总行数total
  56. ----编辑msg、title、text参数,调用textbox()函数,显示结果
  57. """
  58. def print_result():
  59.     total = 0
  60.     lines = 0
  61.     text = ""
  62.     # 遍历记录各类型源文件个数的字典,取得文件数和代码数,并累加代码总行数,自动生成统计文本字符串;
  63.     for each_key in file_quantity_dict:
  64.         lines = code_quantity_dict[each_key]
  65.         total += lines
  66.         text += "[%s]源文件 %d 个,源代码 %d 行\n" % (each_key,file_quantity_dict[each_key],lines)

  67.     diff = 100000 - total
  68.     speed_of_progress = (total / 100000) * 100
  69.     msg = "您目前共累计编写了 %d 行代码,完成进度:%.2f %%\n离10万行代码还差 %d 行,请继续努力!" % (total,speed_of_progress,diff)
  70.     title = "统计结果"
  71.     g.textbox(msg,title,text)


  72. # 定义空字典,调用diropenbox()函数让用户选择目标文件夹
  73. ext_list = [".py",".c",".cc",".cpp",".asm","pas","java"]
  74. file_quantity_dict = {}
  75. code_quantity_dict = {}
  76. specified_folder = g.diropenbox("请选择代码库:")
  77. search_file(specified_folder)
  78. print_result()
复制代码



我这diropenbox()怎么跟小甲鱼的不一样啊
11.jpg
22.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-3 21:19:22 | 显示全部楼层
楼主写的代码很有层次感,学习了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 20:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表