lamupen 发表于 2020-7-26 18:50:06

字典中的列表自增问题求教

import easygui as g
import os

totalcount = 0
codingdict = {}


def ChoiceCountType():
    '''选择要统计哪些代码文件类型'''
    global codingdict
    choices = [".py", ".c", ".cpp", ".txt"]# 设置代码文件选项
    usertype = g.multchoicebox(msg="请从下列列表中选择要统计的代码文件类型!", title="代码统计", choices=choices)
    codingdict = dict.fromkeys(usertype, )# 给类型字典赋初值{类型,[个数,有效代码数]}
    dirpath = g.diropenbox()
    return dirpath


def ChoiceDir(dirpath):
    global totalcount
    for paths, dirs, files in os.walk(dirpath):
      if len(files) > 0:# 如果有文件,就执行下一步的遍历文件列表
            for file in files:
                # if file[-3:]==".py":#如果是py文档,执行接下来的操作 这种方式是死写法,用倒着数判断文件类型
                ext = os.path.splitext(file)# 这是活写法,切片出类型,然后判断出类型在不在编程类型文件里
                if ext in codingdict.keys():# 如果切出来的类型在字典的KEY中
                  codingdict += 1# 字典里个数+1
                  filelinecount = 0 #原本是设置了一个变量统计每个文件的有效代码
                  with open(paths + "\\" + file, encoding="utf-8",
                              errors="ignore") as fp:# py文件是UTF-8,TXT是ANSI,单独设置会报错所以忽略报错
                        dateline = fp.readlines()
                  for line in dateline:
                        if line == "\n":
                            continue
                        elif line.startswith("#"):
                            continue
                        else:
                            filelinecount += 1#现在不应该做变量自增,应该是字典里的代码量自增
                            #codingdict.values()+=1 #?????这个咋不办事啊T,T
                            totalcount += 1
                  print(f"{file}有效代码数是{filelinecount}")
    print(f"总代码量是{totalcount}")



openpath = ChoiceCountType()
ChoiceDir(openpath)
for each in codingdict.keys():
    print(f"共有{each}文件{codingdict}个")



老哥们,俩问题求教:
1.为啥运行时会先输出一个?
2.我定义了一个类型统计字典{类型,[个数,有效代码数]},想在for file in files循环中,实现文件个数,有效代码量的自增,这个咋处理都处理不好,求老哥们支支招,写了5小时了{:10_266:}

lamupen 发表于 2020-7-26 18:53:04

if ext in codingdict.keys():# 如果切出来的类型在字典的KEY中

这样写,文件数量统计好像也不对。。{:10_247:}

proer 发表于 2020-7-26 19:54:24

1.先输出一个是执行下面这行代码就会输出,这个模块我也不太清楚
usertype = g.multchoicebox(msg="请从下列列表中选择要统计的代码文件类型!", title="代码统计", choices=choices)
2.python3中dict.values()返回的不是数组类型,dict.keys()也不是,所以还是用这种codingdict+=1
dic = {'a':1, 'b':}
print(dic.values())   # dict_values(])
print(type(dic.values()))# <class 'dict_values'>
print(type(dic.keys()))   # <class 'dict_keys'>

proer 发表于 2020-7-26 19:56:25

proer 发表于 2020-7-26 19:54
1.先输出一个是执行下面这行代码就会输出,这个模块我也不太清楚
usertype = g.multchoicebox(msg= ...

with open()那里好像也有问题 应该是 +'\\'

lamupen 发表于 2020-7-26 20:34:52

自顶

lamupen 发表于 2020-7-26 22:00:29

import easygui as g
import os

codingdict = {}
typedict={}
linecountdict={}


def ChoiceCountType():
    '''选择要统计哪些代码文件类型'''
    global codingdict
    global typedict
    global linecountdict

    choices = [".py", ".c", ".cpp", ".txt"]# 设置代码文件选项
    usertype = g.multchoicebox(msg="请从下列列表中选择要统计的代码文件类型!", title="代码统计", choices=choices)
    #codingdict = dict.fromkeys(usertype, )# 给类型字典赋初值{类型,[个数,有效代码数]}
    typedict=dict.fromkeys(usertype,0)
    linecountdict=dict.fromkeys(usertype,0)
    dirpath = g.diropenbox()
    return dirpath

def calc_code(file_name):
    '''统计有效代码行的函数'''
    codinglines = 0
    with open(file_name, encoding="utf-8",errors="ignore") as fp:
      print('正在分析文件:%s ...' % file_name)
      dateline = fp.readlines()
      for line in dateline:
            if line == "\n":
                continue
            elif line.startswith("#"):
                continue
            else:
                codinglines+=1
    return codinglines


def ChoiceDir(dirpath):
    '''用os.walk()遍历计算文件数量和有效代码数分别存进对应列表中'''
    global typedict
    global linecountdict

    for paths, dirs, files in os.walk(dirpath):
      if len(files) > 0:# 如果有文件,就执行下一步的遍历文件列表
            for file in files:
                ext = os.path.splitext(file)# 切片出类型,然后判断出类型在不在编程类型文件里
                if ext in typedict.keys():# 如果切出来的类型在字典的KEY中
                  lines=calc_code(file)   #调用函数算出现在循环到的这个文件有多少有效代码行数
                  typedict+=1      #基于这个key给typedict赋值,统计现在这个文件类型的文件数量
                  linecountdict+=1   #基于这个key给linecountdict赋值,统计现在这个类型的文件有多少有效行数

def ShowResult():
    msg="你现在总共写了XXX代码"
    text=""
    title="统计结果"
    lines=0
    totallines=0

    for i in linecountdict.keys():
      print(f"{i}类型的文件共计有效代码量{linecountdict}行")

    for each in typedict.keys():
      print(f"有{each}类型的文件{typedict}个")





openpath = ChoiceCountType()
ChoiceDir(openpath)
ShowResult()

这回我参照小甲鱼课后作业,一个字典搞不定就用两个字典分别存,结果报的错让我更迷茫了。{:10_266:}

零基础从入门到放弃。。。。大佬们谁能帮忙瞅瞅哪出的问题。

lamupen 发表于 2020-7-26 23:36:58

import easygui as g
import os

codingdict = {}
typedict={}
linecountdict={}


def ChoiceCountType():
    '''选择要统计哪些代码文件类型'''
    global codingdict
    global typedict
    global linecountdict

    choices = [".py", ".c", ".cpp", ".txt",".cs",".aspx"]# 设置代码文件选项
    usertype = g.multchoicebox(msg="请从下列列表中选择要统计的代码文件类型!", title="代码统计", choices=choices)
    #codingdict = dict.fromkeys(usertype, )# 给类型字典赋初值{类型,[个数,有效代码数]}
    typedict=dict.fromkeys(usertype,0)
    linecountdict=dict.fromkeys(usertype,0)
    dirpath = g.diropenbox()
    return dirpath

def calc_code(paths,file_name):
    '''统计有效代码行的函数'''
    codinglines = 0
    with open(paths + "\\" + file_name,errors="ignore") as fp:
      print('正在分析文件:%s ...' % file_name)
      dateline = fp.readlines()
      for line in dateline:
            if line == "\n":
                continue
            elif line.startswith("#"):
                continue
            else:
                codinglines+=1
    return codinglines


def ChoiceDir(dirpath):
    '''用os.walk()遍历计算文件数量和有效代码数分别存进对应列表中'''
    global typedict
    global linecountdict

    for paths, dirs, files in os.walk(dirpath):
      if len(files) > 0:# 如果有文件,就执行下一步的遍历文件列表
            for file in files:
                ext = os.path.splitext(file)# 切片出类型,然后判断出类型在不在编程类型文件里
                if ext in typedict.keys():# 如果切出来的类型在字典的KEY中
                  lines=calc_code(paths,file)   #调用函数算出现在循环到的这个文件有多少有效代码行数
                  typedict+=1      #基于这个key给typedict赋值,统计现在这个文件类型的文件数量
                  linecountdict+=lines   #基于这个key给linecountdict赋值,统计现在这个类型的文件有多少有效行数

def ShowResult():
    msg=""
    text=""
    title="统计结果"
    totallines=0

    for i in linecountdict.keys():
      for each in typedict.keys():
            if i==each:
                text += (f"[{i}]类型的文件有{typedict}个,共计有效代码量{linecountdict}行\n")
            totallines+=linecountdict
    #print(totallines)
    msg=f"您目前共累积编写了{totallines}行代码,完成进度:{float(totallines/10000)}%\n离 10 万行代码还差{10000-totallines}行,请继续努力!"
    g.textbox(msg, title, text)





openpath = ChoiceCountType()
ChoiceDir(openpath)
ShowResult()




老哥们,用两个字典存可以实现了,我想请教下,用一个带列表的字典#codingdict = dict.fromkeys(usertype, )# 给类型字典赋初值{类型,[个数,有效代码数]}然后遍历file时让个数和有效代码数自增有办法实现吗?

lamupen 发表于 2020-7-28 09:58:47

在线求教
页: [1]
查看完整版本: 字典中的列表自增问题求教