鱼C论坛

 找回密码
 立即注册
查看: 2272|回复: 16

[已解决]关于Python第30讲第三题

[复制链接]
发表于 2019-8-4 21:11:15 | 显示全部楼层 |阅读模式

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

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

x
(30讲课后第3题)这道题目是在指定路径查找指定类型文件并把目录生成表格。下面是小甲鱼给的答案,为什么我想直接以D盘作为sart_dir的话会报错呢,请问如果我想在整个D盘范围搜索应该怎么修改? 谢谢大家!
  1. import os

  2. def search_file(start_dir, target) :
  3.     os.chdir(start_dir)
  4.    
  5.     for each_file in os.listdir(os.curdir) :
  6.         ext = os.path.splitext(each_file)[1]
  7.         if ext in target :
  8.             vedio_list.append(os.getcwd() + os.sep + each_file + os.linesep) # 使用os.sep是程序更标准
  9.         if os.path.isdir(each_file) :
  10.             search_file(each_file, target) # 递归调用
  11.             os.chdir(os.pardir) # 递归调用后切记返回上一层目录

  12. start_dir = input('请输入待查找的初始目录:')
  13. program_dir = os.getcwd()

  14. target = ['.mp4', '.avi', '.rmvb']
  15. vedio_list = []

  16. search_file(start_dir, target)

  17. f = open(program_dir + os.sep + 'vedioList.txt', 'w')
  18. f.writelines(vedio_list)
  19. f.close()
复制代码


最佳答案
2019-8-4 21:24:27
本帖最后由 jackz007 于 2019-8-4 21:30 编辑

        从 'D:\\' 开始搜索,问题应该是出在系统文件夹 'D:\\System Volume Information' 无权限访问,从而导致程序异常退出的问题上,把风险语句纳入 try ... except 语句块,捕获错误,使程序可以平安跨过无权限目录。
  1. import os

  2. def search_file(start_dir , target) :
  3.     os . chdir(start_dir)
  4.    
  5.     try:
  6.         for each_file in os . listdir(os.curdir) :           # 风险语句
  7.             ext = os . path . splitext(each_file)[1]         # 如果风险语句成功过关会从这里继续
  8.             if ext in target :
  9.                 vedio_list . append(os . getcwd() + os . sep + each_file + os . linesep) # 使用os.sep是程序更标准
  10.             if os . path . isdir(each_file) :
  11.                 search_file(each_file, target) # 递归调用
  12.                 os . chdir(os . pardir) # 递归调用后切记返回上一层目录
  13.     except:                                                  # 如果风险语句未能过关会跳来这里继续
  14.         os . chdir(os . pardir)

  15. start_dir = input('请输入待查找的初始目录:')
  16. program_dir = os . getcwd()

  17. target = ['.mp4', '.avi', '.rmvb']
  18. vedio_list = []

  19. search_file(start_dir, target)

  20. f = open(program_dir + os.sep + 'vedioList.txt', 'w')
  21. f.writelines(vedio_list)
  22. f.close()
复制代码
Snipaste_2019-08-04_21-02-51.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-8-4 21:15:33 | 显示全部楼层
不是把目录生成表格
是把路径生成txt文档
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-8-4 21:24:27 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-8-4 21:30 编辑

        从 'D:\\' 开始搜索,问题应该是出在系统文件夹 'D:\\System Volume Information' 无权限访问,从而导致程序异常退出的问题上,把风险语句纳入 try ... except 语句块,捕获错误,使程序可以平安跨过无权限目录。
  1. import os

  2. def search_file(start_dir , target) :
  3.     os . chdir(start_dir)
  4.    
  5.     try:
  6.         for each_file in os . listdir(os.curdir) :           # 风险语句
  7.             ext = os . path . splitext(each_file)[1]         # 如果风险语句成功过关会从这里继续
  8.             if ext in target :
  9.                 vedio_list . append(os . getcwd() + os . sep + each_file + os . linesep) # 使用os.sep是程序更标准
  10.             if os . path . isdir(each_file) :
  11.                 search_file(each_file, target) # 递归调用
  12.                 os . chdir(os . pardir) # 递归调用后切记返回上一层目录
  13.     except:                                                  # 如果风险语句未能过关会跳来这里继续
  14.         os . chdir(os . pardir)

  15. start_dir = input('请输入待查找的初始目录:')
  16. program_dir = os . getcwd()

  17. target = ['.mp4', '.avi', '.rmvb']
  18. vedio_list = []

  19. search_file(start_dir, target)

  20. f = open(program_dir + os.sep + 'vedioList.txt', 'w')
  21. f.writelines(vedio_list)
  22. f.close()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-4 21:31:15 | 显示全部楼层
jackz007 发表于 2019-8-4 21:24
从 'D:\\' 开始搜索,问题应该是出在系统文件夹 'D:\\System Volume Information' 无权限访问,从 ...

赞!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-5 13:05:32 | 显示全部楼层
感谢感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-6 10:29:21 | 显示全部楼层
jackz007 发表于 2019-8-4 21:24
从 'D:\\' 开始搜索,问题应该是出在系统文件夹 'D:\\System Volume Information' 无权限访问,从 ...

请问那怎么样才能获得权限,达到查找文件的目的呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-6 10:34:15 | 显示全部楼层
aaartanis 发表于 2019-8-6 10:29
请问那怎么样才能获得权限,达到查找文件的目的呢?

     Windows 系统的权限管理不可突破,你的这个问题等同于如何把银行的钱变进自己腰包!

     所以,遇到没有权限目录时的唯一正确选择是 - 躲开它。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-6 11:15:24 | 显示全部楼层
jackz007 发表于 2019-8-6 10:34
Windows 系统的权限管理不可突破,你的这个问题等同于如何把银行的钱变进自己腰包!

     所以, ...

那这个查找脚本的价值就大大降低了呀,我还以为直接能对整个电脑,或者一个盘进行查找
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-6 13:09:06 | 显示全部楼层
本帖最后由 jackz007 于 2019-8-6 13:13 编辑
aaartanis 发表于 2019-8-6 11:15
那这个查找脚本的价值就大大降低了呀,我还以为直接能对整个电脑,或者一个盘进行查找


       对整个硬盘乃至整个电脑进行搜索都没问题,但是,前提条件是,必须是有权限访问的所有路径。这已经是极致了,不可能再有其它的任何程序能比我们做的更好!你只要试一下,把被跳过的无权限目录都显示出来,看看 Windows 资源管理器是否能正常访问就知道了。
       操作系统好比银行,它规定了每个用户只能动用自己账户下的资金,不可能动用别人的,这个就是无法逾越的铁律!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-2 00:13:50 | 显示全部楼层
jackz007 发表于 2019-8-4 21:24
从 'D:\\' 开始搜索,问题应该是出在系统文件夹 'D:\\System Volume Information' 无权限访问,从 ...

用了try...except语句块,是不是就有可能没有遍历所有的文件夹?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-2 00:26:53 | 显示全部楼层
滚刀肉拌面008 发表于 2020-2-2 00:13
用了try...except语句块,是不是就有可能没有遍历所有的文件夹?

      它只会在获取文件目录列表出错的情况下,放弃存在问题的目录。这些被放弃的目录你即便是用 Windows 资源管理器也同样无法浏览。从这个意义上说,是会遗漏一些没有权限访问的目录。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-2 01:25:50 | 显示全部楼层
jackz007 发表于 2019-8-4 21:24
从 'D:\\' 开始搜索,问题应该是出在系统文件夹 'D:\\System Volume Information' 无权限访问,从 ...

os . chdir(start_dir)   #这个也是风险语句,第一个风险语句

except:                                                  
        os . chdir(os . pardir)         #好像不要这个也能运行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-3 04:43:49 | 显示全部楼层
jackz007 发表于 2020-2-2 00:26
它只会在获取文件目录列表出错的情况下,放弃存在问题的目录。这些被放弃的目录你即便是用 Windows ...

我的意思是还会遗漏部分与没有权限访问的目录同级的目录.
如果遇到没有权限访问的目录,程序会跳出到上一级目录,导致该目录下还未访问的目录不再被访问.我说的遗漏是这一部分的遗漏.
具体来说 目录a下有两个文件夹c和d,c没有访问权限,d有访问权限,如果程序先去访问c,try ... except 语句块起作用后就不会再访问d了.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-3 11:11:04 From FishC Mobile | 显示全部楼层
滚刀肉拌面008 发表于 2020-2-3 04:43
我的意思是还会遗漏部分与没有权限访问的目录同级的目录.
如果遇到没有权限访问的目录,程序会跳出到上一 ...

        你说这种情况根本就不会出现,没错,一级递归负责对一个子目录进行列表,如果该子目录没有访问权限,会直接结束该级递归。但是,这个行为只会 pass 掉无权限子目录本身,与其它同级子目录毫无关系!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-3 13:16:18 | 显示全部楼层
jackz007 发表于 2020-2-3 11:11
你说这种情况根本就不会出现,没错,一级递归负责对一个子目录进行列表,如果该子目录没有访问权 ...

import os

def search_file(start_dir , target) :
   
    try:
        os . chdir(start_dir)                                # 风险语句
        for each_file in os . listdir(os.curdir) :           
            ext = os . path . splitext(each_file)[1]         # 如果风险语句成功过关会从这里继续
            if ext in target :
                vedio_list . append(os . getcwd() + os . sep + each_file + os . linesep) # 使用os.sep是程序更标准
            if os . path . isdir(each_file) :
                a = os . getcwd() + os . sep + each_file
                search_file(each_file, target) # 递归调用
                print('访问的一般目录:' + os.getcwd())   #确认访问
                if os.getcwd() == a:
                    os . chdir(os . pardir) # 递归调用后切记返回上一层目录
                    print('返回上一次层至:' + os . getcwd())
    except:                                                  # 如果风险语句未能过关会跳来这里继续
        print('出错啦: %s 无访问权限'%start_dir)
        print('except后的当前工作目录:' + os.getcwd())

start_dir = 'E:\\$RECYCLE.BIN'
program_dir = os . getcwd()

target = ['.mp4', '.avi', '.rmvb']
vedio_list = []

search_file(start_dir, target)

f = open(program_dir + os.sep + 'vedioList.txt', 'w')
f.writelines(vedio_list)
f.close()

这是我改过的程序,你看看,初学者说不清楚.
已验证过
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-3 15:08:16 | 显示全部楼层
滚刀肉拌面008 发表于 2020-2-3 13:16
import os

def search_file(start_dir , target) :

  1. #-*-coding:gbk-*-

  2. import os

  3. def search_file(start_dir , target) :
  4.    
  5.     try:
  6.         for each_file in os . listdir(start_dir) :
  7.             x = os . path . join(start_dir , each_file)
  8.             if os . path . isfile(x):
  9.                 ext = os . path . splitext(each_file)[1] . lower()
  10.                 if ext in target:
  11.                     vedio_list . append(x + '\n')
  12.             elif os . path . isdir(x) :
  13.                 search_file(x , target)               
  14.     except:
  15.         print('无权限目录: %s' % start_dir)

  16. start_dir = 'D:\\'
  17. target , vedio_list = ['.mp4', '.avi', '.rmvb'] , []
  18. search_file(start_dir , target)

  19. f = open('vedioList.txt', 'wt')
  20. f . writelines(vedio_list)
  21. f . close()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-3 15:47:26 | 显示全部楼层

厉害,这样就好多了,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-29 11:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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