前些天一同学和我说大过年还有作业,老难了一点都不想写,要不发给我看看,顺便能教教作业是咋写的。我想着又不是同一专业的,学的语言也不同,我当场就说,这你们专业的作业,我一外行咋会啊,尽量看看吧。
话不多说,上题目
第一眼看到就是想着,就是读文件操作嘛,然后对文件名进行筛选,同一文件前缀的进行脚本数递增,然后再进行读行操作。嗯大致就这样。后续在编写的时候再进行调整。于是,二话不说,开始现学,开始找资料。终于在几个小时后完成了第一部分。
利用os进行读文件操作,在循环中对进行名进行筛选,并添加进行列表中,然后对此列表进行去重操作
import os
import re
path = os.getcwd() #获取当前路径
path=r'D:\一级软件\任务7-data' #文件路径位置
count=0 #记录总的 .py 文件数目
list_name=[] #存放文件名的小学号部分
lis_file=[]
c=0
for root,dirs,files in os.walk(path): #遍历统计
for each in files:
#对文件名进行筛选 获取已 .py 结尾的文件
if os.path.splitext(each)[1] == '.py':
#print(each)#打印筛选出的文件名
count+=1
list_name.append(re.search('(\d+)', each).group())# 对获取的文件名进行正则判断获取学号部分
#print(count)#打印所有以 .py结尾的文件
list_name.sort() #将列表排序,sort是排序的意思
print(list_name) #打印获取到的小学号 存在重复
i = 0
print("id ","小学号 "," 个数 ")
for s in list_name: #对于list_name中的每一个元素s
print(i, s,list_name.count(s))
# 循环判断列表中的数据个数是否大于1,大于则将重复的移除
while list_name.count(s) > 1: #li.count(s)是统计里中s的个数
list_name.remove(s) #删除li列表中的元素s
i = i + 1
print(list_name)#打印所有的学号 无重复
第二部分的读取代码行数的程序也在第二天抽时间进行,一开始无法理解好for循环的嵌套进行读取,就只能另起一个类进行测试,避免破坏了原来的代码结构
import os
import re
path = os.getcwd() #获取当前路径
path=r'D:\一级软件\任务7-data' #文件路径位置
count=0 #记录总的 .py 文件数目
linenum =0 # 记录行数
for root, dirs, files in os.walk(path): # 遍历统计
for each in files:
# 对文件名进行筛选 获取已 .py 结尾的文件
if os.path.splitext(each)[1] == '.py':
# 对文件名进行筛选 获取已 .py 结尾的文件
if(re.search('(\d+)', each).group() == '8'):
position = root + '\\' + each # 构造绝对路径,"\\",其中一个'\'为转义符
print(each)
#print(each.count())#打印筛选出的文件名
linenum += len(open(position, 'r', encoding='UTF-8',errors="ignore").readlines())
print(linenum)
最后最后最后,在自己的不懈努力下,完整的代码终于是好了。因为也是半路上车,代码可能就没有规范美观可言了,但能运行,能拿到相关数据我觉得我做的还挺不错了,哈哈。
import os
import re
path = os.getcwd() #获取当前路径
path=r'D:\一级软件\任务7-data' #文件路径位置 修改为自己的文件路径
count=0 #记录总的 .py 文件数目
list_name=[] #存放文件名的小学号部分
list_nameno=[]#存放每位同学调教的脚本数
lis_file=[] #用来存放每位同学的总代码行数
i = 0#进行最后循环遍历的参数
for root, dirs, files in os.walk(path): # 遍历统计
for each in files:
# 对文件名进行筛选 获取已 .py 结尾的文件
if os.path.splitext(each)[1] == '.py':
# print(each)#打印筛选出的文件名
count += 1
list_name.append(re.search('(\d+)', each).group()) # 对获取的文件名进行正则判断获取学号部分
print(count)#打印总 .py 文件数
list_name.sort() # 将列表排序,sort是排序的意思
#print(list_name) #打印获取到的小学号 存在重复
#将小学号集合进行移除重复元素 并对脚本数进行统计
for s in list_name: # 对于list_name中的每一个元素s 循环判断列表中的数据个数是否大于1,大于则将重复的移除
list_nameno.append(list_name.count(s))#将每位同学提交的脚本数进行储存
while list_name.count(s) > 1: # li.count(s)是统计里中s的个数
list_name.remove(s) # 删除li列表中的元素s
#print(list_nameno)#打印脚本数
#循环读取每位同学的脚本行数 添加进列表中
for u in list_name:
linenum = 0 # 记录行数 且在每读取完一个同学的脚本总行数后进行重置 进而读取下一位
for root, dirs, files in os.walk(path): # 遍历统计
for each in files:
# 对文件名进行筛选 获取已 .py 结尾的文件
if os.path.splitext(each)[1] == '.py':
# 通过小学号向上查找对应的文件名 并构造路径 进行文件读行操作 再进行每个文件行数的累加操作后追加至列表中
if(re.search('(\d+)', each).group() == str(u)):
position = root + '\\' + each # 构造绝对路径,"\\",其中一个'\'为转义符
print(each)#打印筛选出的文件名
linenum += len(open(position, 'r', encoding='UTF-8', errors='ignore').readlines())
print(linenum)#每查询完一位同学的便在其最后进行打印其总行数
lis_file.append(linenum)#将每位同学的总行数追加至列表中
#print(list_name) # 打印所有的学号 无重复
#print(lis_file)#打印每位同学的脚本总行数
#打印结果
print("id ", "小学号 ", " 个数 ","代码行数")
for li in list_name:
print(i, li, list_nameno[i],lis_file[i])
i+=1
部分运行结果: