|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 铁棍阿童木 于 2017-11-14 19:30 编辑
动动手 3:打开指定的文件,并显示到textbox() 如果文件发生改变让用户选择覆盖保存、放弃保存、另存为。
确实卡了很久,我用的办法是用strip()方法去掉字符串前后所有的"\n",然后再比较。
- # 提供一个文件夹浏览框,让用户选择需要打开的文本文件,打开并显示文件内容
- import easygui as g
- import os
- def search_TXT_file(obj_dir):
- if os.path.isdir(obj_dir):
- os.chdir(obj_dir)
- for each in os.listdir(os.curdir):
- if os.path.isfile(each):
- (f_name,f_exte) = os.path.splitext(each)
- if f_exte == ".txt":
- file_path = os.getcwd() + os.sep + each
- path_list.append(file_path)
- if os.path.isdir(each):
- search_TXT_file(each)
- os.chdir(os.pardir)
- obj_dir = os.curdir
- path_list = []
- search_TXT_file(obj_dir)
- openfile = g.choicebox(msg="请选择要打开的文本文件",choices=path_list)
- with open(openfile) as file_obj:
- content = file_obj.read()
- choice = g.textbox(msg="文件【%s】的内容如下" % openfile,title="显示文件内容",text=content)
- # 将从文件对象中读取到的内容和textbox()返回的内容前后所有的“\n”去掉,方便比对
- choice = choice.strip("\n")
- content = content.strip("\n")
- msg = "检测到文件内容发生改变,请选择以下操作:"
- title = "警告"
- choices = ("覆盖保存","放弃保存","另存为...")
- if choice != content:
- user_option = g.buttonbox(msg,title,choices)
- if user_option == "覆盖保存":
- with open(openfile,"w") as temp_obj:
- temp_obj.write(choice)
- if user_option == "放弃保存":
- pass
- if user_option == "另存为...":
- new_path = g.filesavebox("请选择要保存的位置","另存为",default=".txt")
- if os.path.splitext(new_path)[1] != ".txt":
- new_path += ".txt"
- with open(new_path,"w") as new_file:
- new_file.write(choice)
复制代码
动动手 4:统计指定文件夹中特定源代码文件数量和代码行数,我这里做了过滤处理,代码行数将空行全部过滤了。
感觉函数式编程还是省事很多,我最开始用的方法就是本办法,每种后缀搜索一次,保存一次,最后累加。代码量超过200行。哈哈哈
流水分工式设计还是简洁多了。
- # 找到指定目录下所有[.py .c .cpp .pas .asm .cc .java]源文件
- # 统计每种源文件的个数和源代码行数
- # 最后计算总的代码行数,并显示以10万行为目标的进度百分比;
- import easygui as g
- import os
- """
- 定义一个search_file()函数,根据用户选择,找到目标文件夹下所有符合条件的源代码文件
- ----根据diropenbox()返回的路径搜索文件夹
- --------将指定文件夹变为工作目录
- --------列出当前文件夹下所有文件
- ------------如果search到的是文件
- ----------------用os.path.splitext()方法将文件名和扩展名分离
- ----------------如果文件扩展名在扩展名列表中 in ext_list:
- --------------------调用calculation()计算代码行数
- --------------------将file_quantity_dict字典中对应的键值 += 1(文件计数)
- --------------------同时根据Calculated()函数的返回值将对应字典中相关扩展名的键值 += 1(代码行数累加)
- """
- def search_file(specified_folder):
- os.chdir(specified_folder)
- for each_file in os.listdir(os.curdir):
- if os.path.isfile(each_file):
- ext = os.path.splitext(each_file)[1]
- if ext in ext_list:
- lines = calculation(each_file)
- try:
- file_quantity_dict[ext] += 1
- except KeyError:
- file_quantity_dict[ext] = 1
- try:
- code_quantity_dict[ext] += lines
- except KeyError:
- code_quantity_dict[ext] = lines
- if os.path.isdir(each_file):
- search_file(each_file)
- os.chdir(os.pardir)
- """
- 定义一个Calculated()函数,返回源文件中的代码行数
- ----当search_file()函数传递来的路径打开指定文件
- ----从文件中每读取一行,计数器累计 + 1(过滤空行,使得代码量更加真实)
- ----并向code_quantity_dict字典中相应的键值+=1(行计数)
- ----完成后返回行数;
- """
- def calculation(source_file):
- lines = 0
- with open(source_file,encoding="utf-8") as f:
- for each_row in f:
- if each_row == "\n":
- continue
- else:
- lines += 1
- return lines
- """
- 定义一个print_result()函数,显示统计结果
- ----从file_quantity_dict字典中迭代出扩展名数据
- ----从code_quantity_dict字典中迭代出代码行数据并进行累加得到总行数total
- ----编辑msg、title、text参数,调用textbox()函数,显示结果
- """
- def print_result():
- total = 0
- lines = 0
- text = ""
- # 遍历记录各类型源文件个数的字典,取得文件数和代码数,并累加代码总行数,自动生成统计文本字符串;
- for each_key in file_quantity_dict:
- lines = code_quantity_dict[each_key]
- total += lines
- text += "[%s]源文件 %d 个,源代码 %d 行\n" % (each_key,file_quantity_dict[each_key],lines)
- diff = 100000 - total
- speed_of_progress = (total / 100000) * 100
- msg = "您目前共累计编写了 %d 行代码,完成进度:%.2f %%\n离10万行代码还差 %d 行,请继续努力!" % (total,speed_of_progress,diff)
- title = "统计结果"
- g.textbox(msg,title,text)
- # 定义空字典,调用diropenbox()函数让用户选择目标文件夹
- ext_list = [".py",".c",".cc",".cpp",".asm","pas","java"]
- file_quantity_dict = {}
- code_quantity_dict = {}
- specified_folder = g.diropenbox("请选择代码库:")
- search_file(specified_folder)
- print_result()
复制代码
我这diropenbox()怎么跟小甲鱼的不一样啊 |
-
-
|