实验六 文件操作
一、实验学时: 2学时
二、实验目的
- 掌握:Python中有关文件读写的方法;
- 掌握:与文件相关的函数与标准库的用法;
- 掌握:内置函数open()用法,熟练运用with关键字;
- 掌握:os、os.path、shutil标准库中常用函数的用法。
三、实验内容
- 创建一个程序,要求用户输入一个文件夹路径,程序需要列出该文件夹下的所有文件和文件夹。
- 编写一个程序,要求用户输入一个文件夹路径和一个文件扩展名,程序需要找出该文件夹中所有该扩展名的文件,并将它们复制到新的文件夹中。
- 编写一个程序,要求用户输入一个文件夹路径,程序需要递归地遍历该文件夹下的所有文件和子文件夹,并将所有文件的大小求和。
- 编写一个程序,要求用户输入一个文件夹路径和一个关键词,程序需要在该文件夹下的所有文件中查找该关键词,并返回包含该关键词的文件名。
四、实验结果
(在此部分列出保持缩进格式的程序代码及运行结果截图,请注意保持格式统一,截图清晰,大小合适)
-
创建一个程序,要求用户输入一个文件夹路径,程序需要列出该文件夹下的所有文件和文件夹。
代码块:
# 程序名:test6.1 # 功能:创建一个程序,要求用户输入一个文件夹路径,程序需要列出该文件夹下的所有文件和文件夹。 # 日 期:2023.5.12 # 思 路:通过os.path模块中的walk方法遍历文件,然后输出即可 import os ad = input("请输入文件夹路径:") def visited(path): if not os.path.isdir(path): print('错误:"', path, '"不是一个文件夹路径.') list_dirs = os.walk(path) # 所有路径名,所有目录列表和文件信息 flag1 = flag2 = True for root, dirs, files in list_dirs: # 遍历该元组的目录,和文件信息 for d in dirs: # 遍历目录 if flag1 == True: print("文件夹有:") flag1 = False print(os.path.join(root, d)) for f in files: # 遍历文件信息 if flag2 == True: print("文件有:") flag2 = False print(os.path.join(root, f)) visited(ad)
-
编写一个程序,要求用户输入一个文件夹路径和一个文件扩展名,程序需要找出该文件夹中所有该扩展名的文件,并将它们复制到新的文件夹中。
代码块:
# 程序名:test6.2 # 功能:编写一个程序,要求用户输入一个文件夹路径和一个文件扩展名,程序需要找出该文件夹中所有该扩展名的文件,并将它们复制到新的文件夹中。 # 日 期:2023.5.12 # 思 路:递归遍历文件夹中的所有文件,然后对文件名分隔,并于shutil中的copy方法复制到新的文件夹中 import os import os.path import shutil def seach_copy_File(Path, extension,aim_dir): list_ = [] try: all_File = os.listdir(Path) print("该文件包含该扩展名的文件有:") for each_File in all_File: if os.path.isdir(Path + os.sep + each_File): # 递归遍历子文件夹 seach_copy_File(Path + os.sep + each_File,extension,aim_dir) # 对文件名根据.进行分隔,实现文件名,后缀名的分离 elif each_File.split('.')[-1] == extension: print(Path + os.sep + each_File) list_.append(Path + os.sep + each_File) except: pass # 如果已经存在该文件夹,移除 if os.path.exists(aim_dir): shutil.rmtree(aim_dir) # 如果不存在该文件夹,则创建,用于储存后续提取出来的文件 if not os.path.exists(aim_dir): os.makedirs(aim_dir) # 将列表中的文件复制到新的文件夹 for file in list_: shutil.copy(file, aim_dir) ad = input("请输入一个文件夹路径:") x = input('请输入文件扩展名:') aim_dir = input("请输入存放复制文件的地址:") seach_copy_File(ad, x, aim_dir)
-
编写一个程序,要求用户输入一个文件夹路径,程序需要递归地遍历该文件夹下的所有文件和子文件夹,并将所有文件的大小求和。
代码块:
# 程序名:test6.3 # 功能:编写一个程序,要求用户输入一个文件夹路径,程序需要递归地遍历该文件夹下的所有文件和子文件夹,并将所有文件的大小求和。 # 日 期:2023.5.12 # 思 路:通过os模块中的listdir方法获取文件,然后利用os.path模块中的getsize计算文件大小 import os import os.path def traversal_dir(Path): full_size = 0 for each_File in os.listdir(Path): sub_Path = os.path.join(Path, each_File) if os.path.isfile(sub_Path): # 将文件大小相加 full_size += os.path.getsize(sub_Path) # 如果是文件,则递归遍历文件然后将文件大小相加 if os.path.isdir(sub_Path): full_size += traversal_dir(sub_Path) # 返回总文件大小 return full_size ad = input("请输入文件夹路径:") x = traversal_dir(ad) print("总文件大小为:", x)
-
编写一个程序,要求用户输入一个文件夹路径和一个关键词,程序需要在该文件夹下的所有文件中查找该关键词,并返回包含该关键词的文件名。
代码块:
# 程序名:test6.4 # 功能:编写一个程序,要求用户输入一个文件夹路径和一个关键词,程序需要在该文件夹下的所有文件中查找该关键词,并返回包含该关键词的文件名。 # 日 期:2023.5.12 # 思 路:利用os模块中的walk方法获取文件名,然后分隔并判断是否含有关键词,若含有输出即可 import os import os.path def search_File(Path, key): res_list = [] g = os.walk(Path) for i in g: path, dir_list, file_list = i # 序列解包 for each_File in file_list: # 分隔文件名 if key in each_File.split('\\')[-1]: # 将文件名储存在列表中 res_list.append(each_File) for i in res_list: print(i) ad = input("请输入文件夹路径:") key = input("请输入关键词:") print("包含该关键词的文件有:") search_File(ad, key)
五、实验小结
(包括问题和解决办法、心得体会、意见与建议等)
问题和解决方法:
- 问题一:在利用os模块中的walk()方法时,接受返回值出现问题。
解决方法:通过一个for循环对返回值进行序列解包,依次接收根目录,文件夹,文件等值。 - 问题二:在使用os模块中的getsize()方法时,运行结果显示os不包含getsize()方法。
解决方法:查询资料后,getsize()是os.path模块中的方法,使用时应该为os.path.getsize(path),改正后,程序正常运行。 - 问题三:递归遍历文件夹时,文件路径出现问题。
解决方法:查询资料后,通过os.path.join()方法,更新路径即可,更正后程序正常运行。
心得体会:
- python中的with关键字可以避免文件未被关闭的情况,可以不用使用.close()方法。
- os和os.path模块中含有很多文件操作的方法,包括文件的移动,复制,删除,重命名,压缩和解压缩等。
s.path.getsize(path),改正后,程序正常运行。 - 问题三:递归遍历文件夹时,文件路径出现问题。
解决方法:查询资料后,通过os.path.join()方法,更新路径即可,更正后程序正常运行。
心得体会:
- python中的with关键字可以避免文件未被关闭的情况,可以不用使用.close()方法。
- os和os.path模块中含有很多文件操作的方法,包括文件的移动,复制,删除,重命名,压缩和解压缩等。
- 二进制文件无法直接读取和理解其内容,需要通过反序列化的方法进行读取。