鱼C论坛

 找回密码
 立即注册
查看: 1646|回复: 10

[已解决]python零基础第30讲的作业3题

[复制链接]
发表于 2017-8-13 05:53:27 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 panda652 于 2017-8-13 10:30 编辑

import os

def iden(path):
    list_file = os.listdir(path)
    for each in list_file:
        if os.path.isdir(path + "\\"+ each) == 1:
            iden(path + "\\"+ each)
        else:
            text = os.path.splitext(each)[1]
            if text in (".mp4",".avi",".rmvb"):
                txt.write(path + ":" + each + "\n")
            else:
                continue
    txt.close()

   
path = input("pliease input the path you want:")

txt = open(path + "\\videolist.txt","a")

iden(path)

我的代码如上,在小的测试文件夹中可以实现没问题,为什么在大的范围中就报错了呢?也不明白其中的原因,望各位大大可以指导!谢谢~

问题没有描述清楚抱歉啊-,-。。 如上面的程序截图,第一次的输入地址可以正常运行,但是我改一个地址就不可以了。。。这是为什么呢。。。

但是用小伙伴们的标准答案在第二个地址也是可以正常运行的
最佳答案
2017-8-13 10:37:13
本帖最后由 shinemic 于 2017-8-13 10:38 编辑

问题在多个文件夹的时候就可以复现。原因是过早的关闭了文件流,把 txt.close() 放在外面就行:

  1. # -*- coding: utf-8 -*-

  2. import os

  3. def iden(path):
  4.     list_file = os.listdir(path)
  5.     for each in list_file:
  6.         if os.path.isdir(path + "\"+ each) == 1:
  7.             iden(path + "\"+ each)
  8.         else:
  9.             text = os.path.splitext(each)[1]
  10.             if text in (".mp4",".avi",".rmvb"):
  11.                 txt.write(path + ":" + each + "\n")
  12.             else:
  13.                 continue

  14. path = input("please input the path you want:")
  15. txt = open(path + "\\videolist.txt","w")
  16. iden(path)
  17. txt.close()
复制代码
2.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-8-13 08:16:32 | 显示全部楼层
能说明白点,什么是大的则是文件不行吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-13 08:48:29 | 显示全部楼层
比如在d: e:这些盘符下面不行吧。有些系统文件夹有权限。想办法跳过这些就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-13 10:24:17 | 显示全部楼层
新手·ing 发表于 2017-8-13 08:16
能说明白点,什么是大的则是文件不行吗?

比如说 我如果输入的是,桌面python学习文件夹的hw下就可以正常,但是如果是桌面其他文件夹的路径,就报错了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-13 10:24:54 | 显示全部楼层
ba21 发表于 2017-8-13 08:48
比如在d: e:这些盘符下面不行吧。有些系统文件夹有权限。想办法跳过这些就可以了

应该不是吧,我用他的标准答案就可以正常-,-
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-13 10:37:13 | 显示全部楼层    本楼为最佳答案   
本帖最后由 shinemic 于 2017-8-13 10:38 编辑

问题在多个文件夹的时候就可以复现。原因是过早的关闭了文件流,把 txt.close() 放在外面就行:

  1. # -*- coding: utf-8 -*-

  2. import os

  3. def iden(path):
  4.     list_file = os.listdir(path)
  5.     for each in list_file:
  6.         if os.path.isdir(path + "\"+ each) == 1:
  7.             iden(path + "\"+ each)
  8.         else:
  9.             text = os.path.splitext(each)[1]
  10.             if text in (".mp4",".avi",".rmvb"):
  11.                 txt.write(path + ":" + each + "\n")
  12.             else:
  13.                 continue

  14. path = input("please input the path you want:")
  15. txt = open(path + "\\videolist.txt","w")
  16. iden(path)
  17. txt.close()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-13 11:16:02 | 显示全部楼层
本帖最后由 ba21 于 2017-8-13 11:18 编辑

你的代码修改了一下,完美运行:
  1. import os
  2. import sys

  3. def iden(path):
  4.     os.chdir(path)   # 把指定路径改成工作路径,有了这行代码,后面文件操作会很简单
  5.         
  6.     for each_file in os.listdir(os.curdir) :
  7.         ext = os.path.splitext(each_file)[1]      
  8.         if ext in (".mp4",".avi",".rmvb") :
  9.              file_list.append(path + ":" + each_file + "\n")

  10.         # 如果路径还有文件夹,进入该文件夹继续搜索
  11.         if os.path.isdir(each_file):
  12.             try:
  13.                 iden(each_file) # 递归调用
  14.                 os.chdir(os.pardir) # 递归调用后切记返回上一层目录(**这点很关键**)
  15.             except Exception as reasion: # 跳过拒绝访问文件夹
  16.                 print("文件夹->",reasion)

  17. def savetofile(path,file_list):
  18.     with open(path + r"\videolist.txt","w") as f:
  19.         f.writelines(file_list)

  20.       
  21. file_list=[]               
  22. path = input("pliease input the path you want:")
  23. iden(path)

  24. path = os.path.split(os.path.realpath( sys.argv[0]))[0] #获取代码所在目录
  25. savetofile(path,file_list)
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
shinemic + 1 + 1 哈哈终于能评分了!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-8-13 11:37:38 | 显示全部楼层
shinemic 发表于 2017-8-13 10:37
问题在多个文件夹的时候就可以复现。原因是过早的关闭了文件流,把 txt.close() 放在外面就行:

哦!!明白了!递归的话最后一个循环就把文件给关掉了!谢谢啦!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-13 11:38:28 | 显示全部楼层
ba21 发表于 2017-8-13 11:16
你的代码修改了一下,完美运行:

谢谢亲!!刚刚学到后面的几个视频讲try检验的,好开心能看懂了~谢谢!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-13 11:43:03 | 显示全部楼层
panda652 发表于 2017-8-13 11:38
谢谢亲!!刚刚学到后面的几个视频讲try检验的,好开心能看懂了~谢谢!!

版主的解法更科学(写文件过程与递归过程分开以免出错以及异常处理),应列为采纳方案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-15 00:25:01 | 显示全部楼层
shinemic 发表于 2017-8-13 11:43
版主的解法更科学(写文件过程与递归过程分开以免出错以及异常处理),应列为采纳方案

好的!谢谢提醒!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 11:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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