鱼C论坛

 找回密码
 立即注册
查看: 1802|回复: 6

[已解决]第30课:os。习题3的两个小问题

[复制链接]
发表于 2021-1-26 10:39:33 | 显示全部楼层 |阅读模式

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

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

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

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

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

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

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

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

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

  18. function1(directory, target)

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


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

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

谢谢~
最佳答案
2021-1-26 11:08:24
本帖最后由 jackz007 于 2021-1-26 11:11 编辑

       os.linesep 就是换行符,为列表中的每个字符串添加换行符,就可以用文件的 writelines() 方法,把整个列表的内容一次性写进文件。如果不加这个 os . linesep,写入文件的时候,列表的各个字符串之间就会没有分隔符,所有字符串会粘连在一起,写在同一行中。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-1-26 11:08:24 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2021-1-26 11:11 编辑

       os.linesep 就是换行符,为列表中的每个字符串添加换行符,就可以用文件的 writelines() 方法,把整个列表的内容一次性写进文件。如果不加这个 os . linesep,写入文件的时候,列表的各个字符串之间就会没有分隔符,所有字符串会粘连在一起,写在同一行中。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-26 11:15:50 From FishC Mobile | 显示全部楼层
jackz007 发表于 2021-1-26 11:08
os.linesep 就是换行符,为列表中的每个字符串添加换行符,就可以用文件的 writelines() 方法,把整 ...

好的,理解了。问题一,你看,可否也指教一下?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-26 11:52:51 | 显示全部楼层
本帖最后由 jackz007 于 2021-1-26 11:54 编辑
Peteryo01223 发表于 2021-1-26 11:15
好的,理解了。问题一,你看,可否也指教一下?


      看不懂你的问题 1,主要是这一句不明白,"为何不用 ‘’ 引号引用",能不能进一步说明一下。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-26 12:06:52 From FishC Mobile | 显示全部楼层
jackz007 发表于 2021-1-26 11:52
看不懂你的问题 1,主要是这一句不明白,"为何不用 ‘’ 引号引用",能不能进一步说明一下。

我想问的是,这一句如果仅仅为的是路径与后缀的简单合并,然后记录在案,那么按说,应采取引用“”和加号+的方式,即可实现。而实际上,在括号里的内容都没有用引号“”,难道是它们都参与了函数的运算么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-26 12:35:34 | 显示全部楼层
本帖最后由 jackz007 于 2021-1-26 12:36 编辑
Peteryo01223 发表于 2021-1-26 12:06
我想问的是,这一句如果仅仅为的是路径与后缀的简单合并,然后记录在案,那么按说,应采取引用“”和加号 ...


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

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
Peteryo01223 + 1 + 1 鱼C有你更精彩^_^

查看全部评分

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

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-26 14:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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