Peteryo01223 发表于 2021-1-26 10:39:33

第30课:os。习题3的两个小问题

本帖最后由 Peteryo01223 于 2021-1-26 10:54 编辑

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

看了答案后,我的抄写,及注释,运行成功:
import os

def function1(directory, target):
    os.chdir(directory)

    for each in os.listdir(os.curdir):
      suffix = os.path.splitext(each) # 把文件名的后缀,单独提取出来
      if suffix in target: # 如果后缀与要寻找的后缀相同
            video_list.append(os.getcwd() + os.sep + each + os.linesep)
            # 使用os.getcwd(),获得当前的路径,
            # os.sep的用法,能够让代码在不同的平台上都能运行, 使得程序更标准
            # os.linesep字符串,能给出当前平台使用的行终止符
      if os.path.isdir(each): # 判断语句,如果each是一个文件夹,即下一层还有文件或文件夹
            function1(directory, target) # 在本函数中,调用其本身,即递归调用
            os.chdir(os.pardir) # 递归调用后,切记重新返回上一层的母目录

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

target = ['.mp3','.mp4','.avi','.rmvb']
video_list = []

function1(directory, target)

f = open(program_dir + os.sep + 'videoList.txt', 'w') # 在同一个路径上,创建一个新文档 videoList.txt
f.writelines(video_list) # 用于向文档中写入一序列,即:video_list, 当中的字符串
f.close() # 随即,关闭文件,也就是保存。否则,在缓存中,可能由于断电而遗失。

问题:
1. 第9行,什么目的?我的理解是,本行把前面刚 splitext 拆分的“路径” 和 “文件名”,重新写到一起,放入列表 video_list 中,予以记录。但,为何不用 ‘’ 引号引用,Python 也不报错呢?

2. 第9行,我查到,os.linesep 是给出当前平台使用的行终止符,的意思。我尝试删除 os.linesep,重新 run,发现原来 txt文件中的两个条目,只剩第一条了。请问,这是因为第一条不终止,后面的就不能写上去?如果写不上去,为何 Python 并不报错呢?

谢谢~

jackz007 发表于 2021-1-26 11:08:24

本帖最后由 jackz007 于 2021-1-26 11:11 编辑

       os.linesep 就是换行符,为列表中的每个字符串添加换行符,就可以用文件的 writelines() 方法,把整个列表的内容一次性写进文件。如果不加这个 os . linesep,写入文件的时候,列表的各个字符串之间就会没有分隔符,所有字符串会粘连在一起,写在同一行中。

Peteryo01223 发表于 2021-1-26 11:15:50

jackz007 发表于 2021-1-26 11:08
os.linesep 就是换行符,为列表中的每个字符串添加换行符,就可以用文件的 writelines() 方法,把整 ...

好的,理解了。问题一,你看,可否也指教一下?

jackz007 发表于 2021-1-26 11:52:51

本帖最后由 jackz007 于 2021-1-26 11:54 编辑

Peteryo01223 发表于 2021-1-26 11:15
好的,理解了。问题一,你看,可否也指教一下?

      看不懂你的问题 1,主要是这一句不明白,"为何不用 ‘’ 引号引用",能不能进一步说明一下。

Peteryo01223 发表于 2021-1-26 12:06:52

jackz007 发表于 2021-1-26 11:52
看不懂你的问题 1,主要是这一句不明白,"为何不用 ‘’ 引号引用",能不能进一步说明一下。

我想问的是,这一句如果仅仅为的是路径与后缀的简单合并,然后记录在案,那么按说,应采取引用“”和加号+的方式,即可实现。而实际上,在括号里的内容都没有用引号“”,难道是它们都参与了函数的运算么?

jackz007 发表于 2021-1-26 12:35:34

本帖最后由 jackz007 于 2021-1-26 12:36 编辑

Peteryo01223 发表于 2021-1-26 12:06
我想问的是,这一句如果仅仅为的是路径与后缀的简单合并,然后记录在案,那么按说,应采取引用“”和加号 ...

       括号里面都是字符串运算啊,是在为文件添加路径和换行符,你说的也对,可以不用列表,改用字符串累加,最后用文件的 write() 方法,把字符串直接写入文件也是完全可以的。

Peteryo01223 发表于 2021-1-26 13:24:20

jackz007 发表于 2021-1-26 12:35
括号里面都是字符串运算啊,是在为文件添加路径和换行符,你说的也对,可以不用列表,改用字符 ...

感谢!
页: [1]
查看完整版本: 第30课:os。习题3的两个小问题