鱼C论坛

 找回密码
 立即注册
查看: 791|回复: 7

[已解决]第30讲 第3题 查找视频文件 函数中路径更改的影响问题

[复制链接]
发表于 2020-4-22 11:38:53 | 显示全部楼层 |阅读模式

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

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

x

编写一个程序,用户输入开始搜索的路径,查找该路径下(包含子文件夹内)所有的视频格式文件(要求查找mp4, rmvb, avi的格式即可),并把创建一个文件(vedioList.txt)存放所有找到的文件的路径,程序实现如图:

我的代码和小甲鱼的代码跑起来结果都没问题,主要是储存文件创建在哪里的问题,函数里路径的更改能影响上面语句的当前路径吗?

我的代码:
import os

def search_video(start_dir) :
    os.chdir(start_dir)   
    all_files = os.listdir(os.curdir)
    for each_file in all_files:
        each = os.path.splitext(each_file)
        if each[1] in ['.mp4', '.rmvb', '.avi'] :
            path = os.getcwd() + os.sep + each_file
            f.write(path + '\n')
        if os.path.isdir(each_file) :
            search_video(each_file)   
            os.chdir(os.pardir)    
            
start_dir = input('请输入待查找的初始目录:')
f = open('videoList.txt', 'w')  # 疑问:不带路径直接打开应该是在python的当前工作目录,为什么执行序发现f是创建在start_dir中?
search_video(start_dir)         # 疑问:先打开f,再执行函数,函数更改了当前路径,能影响上一语句吗?
f.close()

小甲鱼代码:
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)[1]
        if ext in target :
            vedio_list.append(os.getcwd() + os.sep + each_file + os.linesep) # linesep终止符(换行)
        if os.path.isdir(each_file) :
            search_file(each_file, target) 
            os.chdir(os.pardir) 

start_dir = input('请输入待查找的初始目录:')  
program_dir = os.getcwd()  # 当前工作目录,即Python的目录(还没执行函数)

target = ['.mp4', '.avi', '.rmvb']
vedio_list = []  # 可以在函数内被修改,无需用global

search_file(start_dir, target)                         # 疑问3:此处执行函数改变了当前目录,能否影响上面的program_dir?
                                                       # 疑问4:program_dir能否直接用star_dir代替?省略上面的program_dir?
f = open(program_dir + os.sep + 'vedioList.txt', 'w')  # 疑问1:program_dir是否多余?直接创建也是在当前目录(即Python的目录)
f.writelines(vedio_list)                               # 疑问2:执行程序发现f是创建在要查找的初始目录中,这是如何实现的?
f.close()
最佳答案
2020-4-22 15:06:08
你的代码的疑问:
疑问:不带路径直接打开应该是在python的当前工作目录,为什么执行序发现f是创建在start_dir中?
只有你的代码在start_dir中才可能这样。
疑问:先打开f,再执行函数,函数更改了当前路径,能影响上一语句吗?
不会影响,文件open的时候就已经创建,之后不会改变路径。
小甲鱼的代码:
疑问1:program_dir是否多余?直接创建也是在当前目录(即Python的目录)
小甲鱼的代码先执行了函数,当前目录已经是start_dir了,此时open不带路径名就会在start_dir下创建文件。
疑问2:执行程序发现f是创建在要查找的初始目录中,这是如何实现的?
你把小甲鱼的代码放在了start_dir下了?
疑问3:此处执行函数改变了当前目录,能否影响上面的program_dir?
代码没有任何地方修改过program_dir,不会改变。
疑问4:program_dir能否直接用star_dir代替?省略上面的program_dir?
在小甲鱼的代码中,如果你希望videoList.txt创建在start_dir下,可以省略或者用star_dir代替。

基于你的问题,你和小甲鱼的代码运行都发现videoList.txt在start_dir下,除了你和小甲鱼的代码都在start_dir下运行以外,还有一种可能就是你在start_dir下看到的videoList.txt不是你运行这两组代码产生的,你最好检查一下文件时间是否是正确,并产看代码目录下是否有videoList.txt。
其实小甲鱼的代码都有不严谨之处,就是运行完毕后,当前目录是start_dir而非program_dir,应该在最后加上os.chdir(program_dir)。你可以在交互界面输入os.getcwd()查看,这个时候你在交互界面如果用open创建没指定路径的文件,是会创建在start_dir下。但是,这个不影响代码的再次运行,因为一运行,当前目录就回到代码所在的目录了,你可以在代码开头加上print(os.getcwd())来验证这一点。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-22 11:41:38 | 显示全部楼层
1,百度 绝对路径 。
2,本来就是啊,你open那里都给出路径了。
3,program_dir不会变。都赋值了,不可能再被改变一次(不操作它的情况下)
4,不可以。万一查找目录和当前目录不在一起呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-22 12:08:00 | 显示全部楼层
qiuyouzhi 发表于 2020-4-22 11:41
1,百度 绝对路径 。
2,本来就是啊,你open那里都给出路径了。
3,program_dir不会变。都赋值了,不可能 ...

没运行程序时我以为是创建在python的工作目录下,有了问题1:program_dir = os.getcwd() 语句执行时,获得的program_dir 是python的工作目录,因此,f按照program_dir 这个路径创建应该也是在这个python的工作目录下

运行后发现是创建在输入的start_dir目录了,有了问题2:按照问题1的思路,这个不能实现的,现在结果是创建在了start_dir目录,这是怎么实现的呢?

实现方法,我的理解是上一语句调用了函数search_file(start_dir, target)改变了python的工作目录为start_dir,进而影响了上面的program_dir获取的python工作目录,因此f就创建在了start_dir下面,有了问题3

按照我的理解,f是这样创建在了start_dir目录,那么program_dir和start_dir是相同的,那么open的时候为什么不可以直接用start_dir代替呢?有了问题4

在我自己写的代码中,open的时候没有用任何路径,按理说应该是创建在python的工作目录,执行序发现f是创建在start_dir中,这是为什么呢?如果按我上面的理解,是函数调用影响了python的工作目录,是可以解释的

您的意思是不是说这个f 是自动创建在 查找到视频的那个文件夹 齐平的目录下?
比如开始查找的目录是E:\\a
a下有b1 b2 b3 三个文件夹和其他文件
b3 文件夹下有 c1 c2 c3 三个文件夹和其他文件
c3 文件夹下有 d1 d2 d3三个文件夹和其他文件
如果在a里的其他文件中有,f就创建在a下
如果a里面没有,在b3的其他文件中有,f就创建在b3下

如果是这样的话,为什么是这样呢。。


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

使用道具 举报

发表于 2020-4-22 15:06:08 | 显示全部楼层    本楼为最佳答案   
你的代码的疑问:
疑问:不带路径直接打开应该是在python的当前工作目录,为什么执行序发现f是创建在start_dir中?
只有你的代码在start_dir中才可能这样。
疑问:先打开f,再执行函数,函数更改了当前路径,能影响上一语句吗?
不会影响,文件open的时候就已经创建,之后不会改变路径。
小甲鱼的代码:
疑问1:program_dir是否多余?直接创建也是在当前目录(即Python的目录)
小甲鱼的代码先执行了函数,当前目录已经是start_dir了,此时open不带路径名就会在start_dir下创建文件。
疑问2:执行程序发现f是创建在要查找的初始目录中,这是如何实现的?
你把小甲鱼的代码放在了start_dir下了?
疑问3:此处执行函数改变了当前目录,能否影响上面的program_dir?
代码没有任何地方修改过program_dir,不会改变。
疑问4:program_dir能否直接用star_dir代替?省略上面的program_dir?
在小甲鱼的代码中,如果你希望videoList.txt创建在start_dir下,可以省略或者用star_dir代替。

基于你的问题,你和小甲鱼的代码运行都发现videoList.txt在start_dir下,除了你和小甲鱼的代码都在start_dir下运行以外,还有一种可能就是你在start_dir下看到的videoList.txt不是你运行这两组代码产生的,你最好检查一下文件时间是否是正确,并产看代码目录下是否有videoList.txt。
其实小甲鱼的代码都有不严谨之处,就是运行完毕后,当前目录是start_dir而非program_dir,应该在最后加上os.chdir(program_dir)。你可以在交互界面输入os.getcwd()查看,这个时候你在交互界面如果用open创建没指定路径的文件,是会创建在start_dir下。但是,这个不影响代码的再次运行,因为一运行,当前目录就回到代码所在的目录了,你可以在代码开头加上print(os.getcwd())来验证这一点。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-24 17:11:10 | 显示全部楼层
txxcat 发表于 2020-4-22 15:06
你的代码的疑问:
疑问:不带路径直接打开应该是在python的当前工作目录,为什么执行序发现f是创建在start ...

非常感谢您!解释很详细!

我自己的代码问题我搞明白了,是我先运行了小甲鱼的代码更改了当前目录,所以我的代码也会创建在star_dir下

关于小甲鱼的代码,我还有个问题:

您说”小甲鱼的代码先执行了函数,当前目录已经是start_dir了,此时open不带路径名就会在start_dir下创建文件。“

可是program_dir的赋值语句在调用函数之上,也就是说,program_dir赋值时获取的路径是Python原始的工作路径,此时还没调用函数,当前目录也没有更改为start_dir,那为什么创建f还会在start_dir下呢?

您也说了”运行完毕后,当前目录是start_dir而非program_dir“,说明start_dir和program_dir不是一个路径,而f是创建在program_dir,结果为什么是创建在start_dir下呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-24 17:41:08 | 显示全部楼层
txxcat 发表于 2020-4-22 15:06
你的代码的疑问:
疑问:不带路径直接打开应该是在python的当前工作目录,为什么执行序发现f是创建在start ...

不用麻烦您啦 我自己试了试已经完全搞明白了!对 当前目录 的理解有点问题

十分感谢您如此耐心和细心!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-24 17:58:38 | 显示全部楼层
start_dir = input('请输入待查找的初始目录:')  
program_dir = os.getcwd()  # 当前工作目录,即Python的目录(还没执行函数)

target = ['.mp4', '.avi', '.rmvb']
vedio_list = []  # 可以在函数内被修改,无需用global

search_file(start_dir, target)                         # 运行函数,函数内部改变目录到start_dir,结束运行时在start_dir
                                                       
f = open(program_dir + os.sep + 'vedioList.txt', 'w')     #open使用了绝对路径,所以无论当前目录在哪里,vediolist.txt都会在program_dir下。 
由于绝对路径的关系,小甲鱼的文件一定是建立在program_dir下,如果出现在start_dir下,一种可能性就是program_dir就是start_dir,也就说小甲鱼的代码放在start_dir下。
另一种可能性是你在start_dir下看到的vedioList.txt不是小甲鱼代码生成的。
你先确认小甲鱼的代码不在start_dir下,open的语句没有修改,然后删掉start_dir下的vedioList.txt,再运行小甲鱼的代码,看看是否还会生成在start_dir下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-24 18:14:55 | 显示全部楼层
txxcat 发表于 2020-4-24 17:58
由于绝对路径的关系,小甲鱼的文件一定是建立在program_dir下,如果出现在start_dir下,一种可能性就是pr ...

谢谢谢谢 确实是小甲鱼的代码不在start_dir下运行了 这个不严谨之处可把我搞蒙了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 20:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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