鱼C论坛

 找回密码
 立即注册
查看: 1430|回复: 13

[已解决]关于如何用os语句操作.py文件

[复制链接]
发表于 2020-3-12 15:18:36 | 显示全部楼层 |阅读模式

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

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

x
这个问题是关于小甲鱼在easygui的课后题,我自己写的程序只能挑选运行.txt的文档。小甲鱼说这个的目的是记录.py文档的代码行数,可是我拷贝后无法执行,把其中那个错误忽视(pass)的部分删错后也会像我一样报错,请问是我的计算机文档的存储方式有什么问题吗?
最佳答案
2020-3-12 15:27:38
import easygui as g
import os


def show_result(start_dir):
    lines = 0
    total = 0
    text = ""

    for i in source_list:
        lines = source_list[i]
        total += lines
        text += "【%s】源文件 %d 个,源代码 %d 行\n" % (i, file_list[i], lines)
    title = '统计结果'
    msg = '您目前共累积编写了 %d 行代码,完成进度:%.2f %%\n离 10 万行代码还差 %d 行,请继续努力!' % (total, total / 1000, 100000 - total)
    g.textbox(msg, title, text)


def calc_code(file_name):
    lines = 0
    with open(file_name, encoding="utf-8") as f:
        print('正在分析文件:%s ...' % file_name)
        try:
            for each_line in f:
                lines += 1
        except UnicodeDecodeError:
            pass  # 不可避免会遇到格式不兼容的文件,这里忽略掉......
    return lines


def search_file(start_dir):
    os.chdir(start_dir)

    for each_file in os.listdir(os.curdir):
        ext = os.path.splitext(each_file)[1]
        if ext in target:
            lines = calc_code(each_file)  # 统计行数
            # 还记得异常的用法吗?如果字典中不存,抛出 KeyError,则添加字典键
            # 统计文件数
            try:
                file_list[ext] += 1
            except KeyError:
                file_list[ext] = 1
            # 统计源代码行数
            try:
                source_list[ext] += lines
            except KeyError:
                source_list[ext] = lines

        if os.path.isdir(each_file):
            search_file(each_file)  # 递归调用
            os.chdir(os.pardir)  # 递归调用后切记返回上一层目录


target = ['.c', '.cpp', '.py', '.cc', '.java', '.pas', '.asm']
file_list = {}
source_list = {}

g.msgbox("请打开您存放所有代码的文件夹......", "统计代码量")
path = g.diropenbox("请选择您的代码库:")

search_file(path)
show_result(path)

跳过错误

跳过错误

不跳过错误

不跳过错误

程序出错原因

程序出错原因
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-12 15:20:41 | 显示全部楼层
把代码发上来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-12 15:22:41 | 显示全部楼层
那个open语句后面加个参数:
encoding='utf-8'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-12 15:23:28 | 显示全部楼层

这个是我写的代码,只能运行.txt
import easygui as g
import os

allfiles=list()
result=g.msgbox('选择您想统计的文件夹')
if result=='OK':
    choice=g.diropenbox()
allpaths=os.walk(choice)

for i in allpaths:
    for each in i[2]:
        allfiles.append(i[0]+'\\'+each)

filedict=dict()
countdict=dict()

for each in allfiles:
    (firstname,familyname)=os.path.splitext(each)
    if familyname in filedict:
        filedict[familyname]+=1
    else:
        filedict.setdefault(familyname,1)

    with open(each) as f:
        count=0
        text=f.readline()
        while text!='':
            if text!='\n':
                count+=1
            text=f.readline()
    if familyname in countdict:
        countdict[familyname]+=count
    else:
        countdict.setdefault(familyname,count)

sumcount=0
for each in countdict.keys():
    sumcount+=countdict[each]   
proportion=str(sumcount/100000*100)+'%'
subtraction=str(100000-sumcount)
msg='您目前共累积编写了'+str(sumcount)+'行代码,完成进度:'+proportion+'\n'+\
       '离十万行代码还差'+subtraction+'行,请继续努力!'

text=list()
for each in filedict.keys():
    text.append('{0}源文件有{1}个,行数{2}\n'.format\
                (each,filedict[each],countdict[each]))

g.textbox(msg,'统计结果',text)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-12 15:24:45 | 显示全部楼层
这样试试:
import easygui as g
import os

allfiles = list()
result = g.msgbox('选择您想统计的文件夹')
if result == 'OK':
    choice = g.diropenbox()
allpaths = os.walk(choice)

for i in allpaths:
    for each in i[2]:
        allfiles.append(i[0] + '\\' + each)

filedict = dict()
countdict = dict()

for each in allfiles:
    (firstname, familyname) = os.path.splitext(each)
    if familyname in filedict:
        filedict[familyname] += 1
    else:
        filedict.setdefault(familyname, 1)

    with open(each, encoding="utf-8") as f:
        count = 0
        text = f.readline()
        while text != '':
            if text != '\n':
                count += 1
            text = f.readline()
    if familyname in countdict:
        countdict[familyname] += count
    else:
        countdict.setdefault(familyname, count)

sumcount = 0
for each in countdict.keys():
    sumcount += countdict[each]
proportion = str(sumcount / 100000 * 100) + '%'
subtraction = str(100000 - sumcount)
msg = '您目前共累积编写了' + str(sumcount) + '行代码,完成进度:' + proportion + '\n' + \
      '离十万行代码还差' + subtraction + '行,请继续努力!'

text = list()
for each in filedict.keys():
    text.append('{0}源文件有{1}个,行数{2}\n'.format \
                    (each, filedict[each], countdict[each]))

g.textbox(msg, '统计结果', text)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-12 15:24:57 | 显示全部楼层

这个是小甲鱼的,也是无法运行
import easygui as g
import os

def show_result(start_dir):
    lines = 0
    total = 0
    text = ""

    for i in source_list:
        lines = source_list[i]
        total += lines
        text += "【%s】源文件 %d 个,源代码 %d 行\n" % (i, file_list[i], lines)
    title = '统计结果'
    msg = '您目前共累积编写了 %d 行代码,完成进度:%.2f %%\n离 10 万行代码还差 %d 行,请继续努力!' % (total, total/1000, 100000-total)
    g.textbox(msg, title, text)

def calc_code(file_name):
    lines = 0
    with open(file_name) as f:
        print('正在分析文件:%s ...' % file_name)
        try:
            for each_line in f:
                lines += 1
        except UnicodeDecodeError:
            pass # 不可避免会遇到格式不兼容的文件,这里忽略掉......
    return lines

def search_file(start_dir) :
    os.chdir(start_dir)
   
    for each_file in os.listdir(os.curdir) :
        ext = os.path.splitext(each_file)[1]
        if ext in target :
            lines = calc_code(each_file) # 统计行数
            # 还记得异常的用法吗?如果字典中不存,抛出 KeyError,则添加字典键
            # 统计文件数
            try:
                file_list[ext] += 1
            except KeyError:
                file_list[ext] = 1
            # 统计源代码行数
            try:
                source_list[ext] += lines
            except KeyError:
                source_list[ext] = lines
            
        if os.path.isdir(each_file) :
            search_file(each_file) # 递归调用
            os.chdir(os.pardir) # 递归调用后切记返回上一层目录
            
target = ['.c', '.cpp', '.py', '.cc', '.java', '.pas', '.asm']
file_list = {}
source_list = {}

g.msgbox("请打开您存放所有代码的文件夹......", "统计代码量")
path = g.diropenbox("请选择您的代码库:")

search_file(path)
show_result(path)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-12 15:26:21 | 显示全部楼层


这个是小甲鱼的,上一个字体是斜的不好看。也是无法运行
import easygui as g
import os

def show_result(start_dir):
    lines = 0
    total = 0
    text = ""

    for i in source_list:
        lines = source_list[i]
        total += lines
        text += "【%s】源文件 %d 个,源代码 %d 行\n" % (i, file_list[i], lines)
    title = '统计结果'
    msg = '您目前共累积编写了 %d 行代码,完成进度:%.2f %%\n离 10 万行代码还差 %d 行,请继续努力!' % (total, total/1000, 100000-total)
    g.textbox(msg, title, text)

def calc_code(file_name):
    lines = 0
    with open(file_name) as f:
        print('正在分析文件:%s ...' % file_name)
        try:
            for each_line in f:
                lines += 1
        except UnicodeDecodeError:
            pass # 不可避免会遇到格式不兼容的文件,这里忽略掉......
    return lines

def search_file(start_dir) :
    os.chdir(start_dir)
    
    for each_file in os.listdir(os.curdir) :
        ext = os.path.splitext(each_file)[1]
        if ext in target :
            lines = calc_code(each_file) # 统计行数
            # 还记得异常的用法吗?如果字典中不存,抛出 KeyError,则添加字典键
            # 统计文件数
            try:
                file_list[ext] += 1
            except KeyError:
                file_list[ext] = 1
            # 统计源代码行数
            try:
                source_list[ext] += lines
            except KeyError:
                source_list[ext] = lines
            
        if os.path.isdir(each_file) :
            search_file(each_file) # 递归调用
            os.chdir(os.pardir) # 递归调用后切记返回上一层目录
            
target = ['.c', '.cpp', '.py', '.cc', '.java', '.pas', '.asm']
file_list = {}
source_list = {}

g.msgbox("请打开您存放所有代码的文件夹......", "统计代码量")
path = g.diropenbox("请选择您的代码库:")

search_file(path)
show_result(path)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-12 15:27:38 | 显示全部楼层    本楼为最佳答案   
import easygui as g
import os


def show_result(start_dir):
    lines = 0
    total = 0
    text = ""

    for i in source_list:
        lines = source_list[i]
        total += lines
        text += "【%s】源文件 %d 个,源代码 %d 行\n" % (i, file_list[i], lines)
    title = '统计结果'
    msg = '您目前共累积编写了 %d 行代码,完成进度:%.2f %%\n离 10 万行代码还差 %d 行,请继续努力!' % (total, total / 1000, 100000 - total)
    g.textbox(msg, title, text)


def calc_code(file_name):
    lines = 0
    with open(file_name, encoding="utf-8") as f:
        print('正在分析文件:%s ...' % file_name)
        try:
            for each_line in f:
                lines += 1
        except UnicodeDecodeError:
            pass  # 不可避免会遇到格式不兼容的文件,这里忽略掉......
    return lines


def search_file(start_dir):
    os.chdir(start_dir)

    for each_file in os.listdir(os.curdir):
        ext = os.path.splitext(each_file)[1]
        if ext in target:
            lines = calc_code(each_file)  # 统计行数
            # 还记得异常的用法吗?如果字典中不存,抛出 KeyError,则添加字典键
            # 统计文件数
            try:
                file_list[ext] += 1
            except KeyError:
                file_list[ext] = 1
            # 统计源代码行数
            try:
                source_list[ext] += lines
            except KeyError:
                source_list[ext] = lines

        if os.path.isdir(each_file):
            search_file(each_file)  # 递归调用
            os.chdir(os.pardir)  # 递归调用后切记返回上一层目录


target = ['.c', '.cpp', '.py', '.cc', '.java', '.pas', '.asm']
file_list = {}
source_list = {}

g.msgbox("请打开您存放所有代码的文件夹......", "统计代码量")
path = g.diropenbox("请选择您的代码库:")

search_file(path)
show_result(path)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-12 15:29:21 | 显示全部楼层
bananatree 发表于 2020-3-12 15:26
这个是小甲鱼的,上一个字体是斜的不好看。也是无法运行

我这里没有报错啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-12 15:29:49 From FishC Mobile | 显示全部楼层
因为在win上默认(open不指定encoding)是以gbk编码打开文件的,而你的py文件是以utf-8编码保存的,所以用gbk打开会出错,所以可以指定用utf-8表面打开文本文件:
with open(each, encoding='utf-8') as f:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-12 15:35:23 | 显示全部楼层
qiuyouzhi 发表于 2020-3-12 15:22
那个open语句后面加个参数:

啊,又是这个问题啊,我之前学os那块儿的时候就只把所有的.txt从utf8改成了ANSI,现在文档里两种编码方式都有,就都乱了,原来.py会用到utf8的编码方式啊,解决了,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-12 15:35:55 | 显示全部楼层

啊,又是这个问题啊,我之前学os那块儿的时候就只把所有的.txt从utf8改成了ANSI,现在文档里两种编码方式都有,就都乱了,原来.py会用到utf8的编码方式啊,解决了,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-12 15:37:00 | 显示全部楼层
hrp 发表于 2020-3-12 15:29
因为在win上默认(open不指定encoding)是以gbk编码打开文件的,而你的py文件是以utf-8编码保存的,所以用gbk ...

嗯嗯,解决了,谢谢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-12 15:38:26 | 显示全部楼层
qiuyouzhi 发表于 2020-3-12 15:29
我这里没有报错啊

就是那个编码问题,我把一部分.txt改成了ANSI,.py的文件我不会改编码模式,系统还是utf-8,都混在一起了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 19:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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