yangxuebabe 发表于 2020-4-22 11:38:53

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


编写一个程序,用户输入开始搜索的路径,查找该路径下(包含子文件夹内)所有的视频格式文件(要求查找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 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)
      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()

qiuyouzhi 发表于 2020-4-22 11:41:38

1,百度 绝对路径 。
2,本来就是啊,你open那里都给出路径了。
3,program_dir不会变。都赋值了,不可能再被改变一次(不操作它的情况下)
4,不可以。万一查找目录和当前目录不在一起呢?

yangxuebabe 发表于 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下

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


txxcat 发表于 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())来验证这一点。

yangxuebabe 发表于 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下呢?

yangxuebabe 发表于 2020-4-24 17:41:08

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

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

十分感谢您如此耐心和细心!

txxcat 发表于 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下。

yangxuebabe 发表于 2020-4-24 18:14:55

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

谢谢谢谢 确实是小甲鱼的代码不在start_dir下运行了 这个不严谨之处可把我搞蒙了
页: [1]
查看完整版本: 第30讲 第3题 查找视频文件 函数中路径更改的影响问题