zhongyuanadler 发表于 2020-4-14 14:13:03

第30讲第三题

我自己写的是,但是感觉不好运作,我自己的思路是只要一个参数就是路径,然后每次遍历时写入videolist文件,写完再关闭,但是保存位置也不确定在哪,之后再递归。 但是总感觉自己摸不透自己的问题在哪? 麻烦大家看看了。谢谢了!

import os
ext = ['.mp4','.rmvb','.avi']
def search_video(file_path):
         allfiles = os.listdir(file_path)
         for eachfile in allfiles:
             if os.path.splitext(eachfile) in ext:
               f = open('videolist.txt','w')
               f.write(str(os.path.dirname(eachfile) + '\\' +str(os.path.basename(eachfile))))
               f.close()
             if os.path.isfile(eachfile):
               search_video(eachfile)
               os.chdir(os.pardir)

filepath = input('路径:')
search_video(filepath)
答案是

import os

def search_file(start_dir, target) :
    os.chdir(start_dir)
   
    for each_file in os.listdir(os.curdir) :
      ext = os.path.splitext(each_file)
      if ext in target :
            vedio_list.append(os.getcwd() + os.sep + each_file + os.linesep) # 使用os.sep是程序更标准
      if os.path.isdir(each_file) :
            search_file(each_file, target) # 递归调用
            os.chdir(os.pardir) # 递归调用后切记返回上一层目录

start_dir = input('请输入待查找的初始目录:')
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()

我可以理解答案是把采集到的文件名存在列表里最后再写入txt,但是txt文件保存位置是哪?


老八秘制 发表于 2020-4-14 14:16:20

默认和代码一个目录

zhongyuanadler 发表于 2020-4-14 14:17:15

这道题自己做的有点晕 隔了两天没复习os模块的指令 就有点不知所措了

wuqramy 发表于 2020-4-14 14:17:55

在程序代码的同一个目录下,如果指定位置保存可以在文件名前加上文件路径

wuqramy 发表于 2020-4-14 14:20:31

zhongyuanadler 发表于 2020-4-14 14:17
这道题自己做的有点晕 隔了两天没复习os模块的指令 就有点不知所措了

那你就收藏一下吧 --> https://fishc.com.cn/thread-45512-1-1.html

zhongyuanadler 发表于 2020-4-14 14:22:24

wuqramy 发表于 2020-4-14 14:20
那你就收藏一下吧 --> https://fishc.com.cn/thread-45512-1-1.html

嗯 谢谢 我是开着这个扩展阅读 一边看一边做的{:10_277:}

zhongyuanadler 发表于 2020-4-14 14:22:56

老八秘制 发表于 2020-4-14 14:16
默认和代码一个目录

恩恩 谢谢,有时间看看我的代码的问题是什么吗?

wuqramy 发表于 2020-4-14 14:28:12

zhongyuanadler 发表于 2020-4-14 14:22
恩恩 谢谢,有时间看看我的代码的问题是什么吗?

你发现了什么问题呢

zhongyuanadler 发表于 2020-4-14 14:39:50

wuqramy 发表于 2020-4-14 14:28
你发现了什么问题呢

跑了一下代码,输入路径什么反应都没有,而且文件都没创建{:10_245:}

永恒的蓝色梦想 发表于 2020-4-14 14:49:34

zhongyuanadler 发表于 2020-4-14 14:22
恩恩 谢谢,有时间看看我的代码的问题是什么吗?

你的代码缩进有问题

zhongyuanadler 发表于 2020-4-14 15:05:52

永恒的蓝色梦想 发表于 2020-4-14 14:49
你的代码缩进有问题

改成这样了:import os
ext = ['.mp4','.rmvb','.avi']
def search_video(file_path):
    allfiles = os.listdir(file_path)
    for eachfile in allfiles:
      if os.path.splitext(eachfile) in ext:
          f = open('videolist.txt','w')
          f.write(str(os.path.dirname(eachfile) + '\\' +str(os.path.basename(eachfile))))
          f.close()
      if os.path.isfile(eachfile):
          search_video(eachfile)
          os.chdir(os.pardir)

filepath = input('路径:')
search_video(filepath)


不过感觉没什么区别啊{:10_243:}

txxcat 发表于 2020-4-14 17:37:25

本帖最后由 txxcat 于 2020-4-14 17:52 编辑

先说几个明显得错误:
import os
ext = ['.mp4','.rmvb','.avi']
def search_video(file_path):
         allfiles = os.listdir(file_path)
         for eachfile in allfiles:
             if os.path.splitext(eachfile) in ext:
               f = open('videolist.txt','w')            #用w打开文件都会覆盖掉老文件,而且,没有绝对路径名,在每个符合条件的目录下都生成一个文件,乱!
               f.write(str(os.path.dirname(eachfile) + '\\' +str(os.path.basename(eachfile))))
               f.close()
             if os.path.isfile(eachfile):                #不该是os.path.isdir ???
               search_video(eachfile)
               os.chdir(os.pardir)                  #之前又没有chdir,现在chdir,混乱了

filepath = input('路径:')
search_video(filepath)

再修正一下代码:
import os
ext = ['.mp4','.rmvb','.avi']
def search_video(file_path):
    allfiles = os.listdir('.')                  #已在目标目录,涉及到递归调用,不能使用目录名
    for eachfile in allfiles:
      if os.path.splitext(eachfile) in ext:
            f = open(cdir+'\\'+'videolist.txt','a')                                             #要使用绝对路径名
            f.write(os.getcwd() + '\\' +str(os.path.basename(eachfile))+'\n')      #os.getcwd()才能获取完整的路径   
            f.close()
      if os.path.isdir(eachfile):
            os.chdir(eachfile)               #转到新的目标目录
            search_video(eachfile)      #递归调用
            os.chdir(os.pardir)            #回到上一级目录

filepath = input('路径:')
cdir=os.getcwd()         #记录工作目录
os.chdir(filepath)         #去到目标目录
search_video(filepath)
os.chdir(cdir)                #回到工作目录

代码是可以跑了,不过还有些不合理的地方,比如你每发现一个视频文件,就打开一次写入再关闭,动作频繁,应该程序开始就打开,然后发现写入,程序结束时关闭才合理:
def search_video(file_path):
    allfiles = os.listdir('.')
    for eachfile in allfiles:
      if os.path.splitext(eachfile) in ext:
            f.write(os.getcwd() + '\\' +str(os.path.basename(eachfile))+'\n')
      if os.path.isdir(eachfile):
            os.chdir(eachfile)
            search_video(eachfile)
            os.chdir(os.pardir)

import os
ext = ['.mp4','.rmvb','.avi']
f = open('videolist.txt','w')   #这回可以用w,保证每次写入的是新数据
filepath = input('路径:')
cdir=os.getcwd()
os.chdir(filepath)
search_video(filepath)
os.chdir(cdir)
f.close()

zhongyuanadler 发表于 2020-4-15 09:26:17

txxcat 发表于 2020-4-14 17:37
先说几个明显得错误:




感谢{:9_232:}
页: [1]
查看完整版本: 第30讲第三题