前言

本文是关于文件与文件夹操作的习题整理和讲解

1~6

1~6 对应,其余为扩充版

序号

函数/方法

英文全称

所属模块

描述

1

listdir()

list directory

os

列出指定文件夹中的文件和子文件夹并返回列表

2

mkdir()

make directory

os

创建文件夹,如果创建的文件夹已存在,则会抛出异常

3

exists()

exists

os.path

判断指定文件或文件夹是否存在

4

isfile()

is file

os.path

判断指定路径是否为文件

5

isdir()

is directory

os.path

判断指定路径是否为文件夹

6

splitext()

split extension

os.path

分隔指定路径中的文件名和扩展名

7

join()

join

os.path

连接多个路径组件,返回一个组合后的路径字符串

8

abspath()

absolute path

os.path

返回路径的绝对路径

9

getsize()

get size

os.path

返回指定文件的大小

10

remove()

remove

os

删除指定的文件

11

rmdir()

remove directory

os

删除空目录,如果目录非空,则会抛出异常

12

walk()

walk

os

遍历指定目录及其所有子目录,返回一个生成器

13

chdir()

change directory

os

改变当前工作目录

14

getcwd()

get current working directory

os

获取当前工作目录

15

rename()

rename

os

重命名文件或目录

16

stat()

status

os

获取文件或目录的详细信息,如大小、权限、最后修改时间等

附加:
os.path.splitext() 函数用于分割路径中的文件名和扩展名。它返回一个元组,其中第一个元素是文件名(不包括扩展名),第二个元素是文件扩展名(包括点 .)。

这里是一个使用 os.path.splitext() 函数的例子:

import os

# 示例路径
path = 'example/path/to/file.txt'

# 使用 os.path.splitext() 分割路径
filename, extension = os.path.splitext(path)

print('Filename:', filename)   # 输出: Filename: example/path/to/file
print('Extension:', extension)  # 输出: Extension: .txt

在这个例子中,os.path.splitext(path) 将路径 'example/path/to/file.txt' 分割为文件名 'example/path/to/file' 和扩展名 '.txt',并将它们作为一个元组返回。这样,就可以分别获取文件名和扩展名,进行进一步的处理或操作。

11~15

序号

函数/方法

英文全称

所属模块

描述

1

remove()

remove

os

删除指定的文件,如果文件无法删除(如只读或无权限)则引发异常

2

startfile()

start file

os

启动外部程序打开指定的文件或 URL

3

getsize()

get size

os.path

获取指定文件的大小,单位为字节

4

getmtime()

get modified time

os.path

获取指定文件的最后修改时间

5

normpath()

normalize path

os.path

规范化路径,插入适当的路径分隔符

6

basename()

base name

os.path

获取路径中最后一个分隔符之后的部分,通常为文件名

7

dirname()

directory name

os.path

获取路径中最后一个分隔符之前的部分,通常为文件夹名

8

make_archive()

make archive

shutil

创建 TAR 或 ZIP 格式的压缩文件

9

unpack_archive()

unpack archive

shutil

解压缩 TAR 或 ZIP 格式的压缩文件

补充:

shutil.rmtree() 与 os.rmdir() 的不同:shutil.rmtree() 用于删除目录树,即可以删除目录及其包含的所有子目录和文件。而 os.rmdir() 只能删除空目录,如果目录非空,会抛出异常。

os.getenv() 函数的用途:os.getenv() 用于获取环境变量的值。如果提供变量名,它会返回该环境变量的值;如果没有找到该变量,它可以返回一个默认值,如果没有指定默认值,则返回 None。

os.path.expanduser() 函数的作用:os.path.expanduser() 解析路径,将 ~(代表当前用户的主目录)或者 ~user(代表指定用户的主目录)展开为相应的完整路径。

16~19

笔记:Python os.path 模块和文件操作

1. os.path.splitext()
  • 用途:分割文件路径,返回(文件名,扩展名)的元组。
  • 例子splitext(r'c:\Python39\python.exe')[1] 返回 '.exe'
2. os.path.split()
  • 用途:分割路径,返回(目录,文件名)的元组。
  • 例子split(r'C:\Python39\python.exe')[1] 返回 'python.exe'
3. os.listdir()os.path.exists()
  • 用途
  • os.listdir():列出指定目录下的所有文件和文件夹。
  • os.path.exists():检查指定的路径是否存在。
  • 注意listdir() 返回的是文件和文件夹的名称列表,不是完整的路径。
4. os.remove()
  • 用途:删除指定的文件。
  • 注意:不可以删除带有只读属性的文件。

10.18

错误

因为 os.listdir() 函数返回的是文件和文件夹的名称列表,而不是完整的路径,所以在使用 os.path.exists() 函数时,需要注意它需要的是一个相对路径或绝对路径,而不是单纯的文件或文件夹名称。如果直接将 os.listdir() 返回的列表中的项(例如 fns[0])作为参数传给 os.path.exists(),而没有将其转换为相对路径或绝对路径,那么这样的参数使用是有问题的。

10.19

错误
在 Python 中,os.remove() 函数用于删除文件。然而,如果文件设有只读属性,os.remove() 函数会因权限不足而抛出 PermissionError 异常。

10.20

判断对错:已知当前工作目录为C:\python39,那么下面代码的运行结果是若干 True。

from os import listdir
 from os.path import exists
 for fn in listdir(r’D:')
 print(exists(fn))

判断:错误

原因:

listdir(r’D:') 会列出 D 盘根目录下的所有文件和文件夹的名称,但是这些名称本身并不是完整的路径,所以直接使用 exists(fn) 无法判断这些文件或文件夹是否存在,因为 exists() 需要的是一个完整的路径。

10.21

判断对错:下面的代码运行一次和连续运行多次的结果是一样的。
from os import mkdir
mkdir(‘test’)

判断:错误

原因:

  1. os.mkdir('test') 用于创建一个名为 ‘test’ 的新目录。如果该目录已经存在,再次运行 os.mkdir('test') 会抛出一个 FileExistsError 异常,因为不能创建已经存在的目录。
  2. 第一次运行代码时,如果 ‘test’ 目录不存在,os.mkdir('test') 将成功创建该目录。
  3. 连续运行多次该代码,从第二次开始,由于 ‘test’ 目录已经存在,os.mkdir('test') 将每次运行时都抛出异常,导致程序无法像第一次那样正常结束。

因此,运行一次和连续运行多次 os.mkdir('test') 的结果是不一样的。第一次可能成功创建目录,而后续尝试会因为目录已存在而抛出异常。为了避免这个异常,可以在调用 os.mkdir() 之前使用 os.path.exists() 检查目录是否已经存在:

from os import mkdir
from os.path import exists

if not exists('test'):
    mkdir('test')

这段代码会先检查 ‘test’ 目录是否存在,如果不存在,才会调用 mkdir('test') 创建目录。这样可以确保无论代码运行多少次,都不会抛出 FileExistsError 异常。

10.22

判断对错:Python标准库os中的函数startfile()可以启动任何已关联应用程序的文件,并自动调用关联的应用程序。

判断:正确

原因:
os.startfile() 函数是 Windows 特有的函数,它用于启动与指定文件类型关联的默认应用程序。当传入一个文件路径给 os.startfile(file_path),它会使用该文件类型的默认程序打开这个文件。

这个函数通常用于打开数据文件,如文档、图片、音乐等,它会自动调用与这些文件类型关联的程序。例如,如果传入的是一个 .txt 文件,它将使用注册为 .txt 文件默认打开程序的文本编辑器或查看器。

需要注意的是,os.startfile() 是特定于 Windows 系统的,并且在调用时需要相应的权限,以确保能够启动外部程序。

以下是 os.startfile() 的一个简单示例:

import os

# 假设 'example.txt' 是一个文本文件
os.startfile('example.txt')

这将打开关联到 .txt 文件的默认程序,通常是一个文本编辑器或阅读器。

10.23

判断对错:假设os模块已导人,那么列表推导式[filename forfilename in os.listdir(‘C:\Windows’)if filename.endswith(‘.exe’)
的作用是列出C:\Windows文件夹中所有扩展名为exe的文件。

判断:正确

原因:
列表推导式 [filename for filename in os.listdir('C:\\Windows') if filename.endswith('.exe')] 的作用是遍历 C:\Windows 文件夹中所有文件的名称,并且使用 if 子句来筛选出那些以 '.exe' 结尾的文件名称。

这里的关键点是 os.listdir('C:\\Windows') 返回 C:\Windows 文件夹中所有文件和文件夹的名称,然后列表推导式通过 for 循环遍历这些名称,并且使用 if 条件检查每个名称是否以 '.exe' 结尾。str.endswith(suffix) 函数检查字符串 str 是否以 suffix 结束,如果是,则返回 True

如果 C:\Windows 文件夹中存在扩展名为 .exe 的文件,这个列表推导式将只包含这些文件的名称。

以下是使用这个列表推导式的一个完整示例:

import os

exe_files = [filename for filename in os.listdir('C:\\Windows') if filename.endswith('.exe')]
print(exe_files)

执行这段代码将打印出 C:\Windows 文件夹中所有扩展名为 .exe 的文件的名称列表。

24~29

序号

函数/方法

英文全称

所属模块

描述

1

isfile()

is file

os.path

用来测试给定的路径是否为文件

2

isdir()

is directory

os.path

用来测试给定的路径是否为文件夹

3

listdir()

list directory

os

返回包含指定路径中的所有文件和文件夹名称的列表

4

rename()

rename

os

可以实现文件重命名或在同一文件系统中移动操作

5

listdir()

list directory

os

列出指定文件夹中第一层级的文件和文件夹列表,不包括子文件夹中的文件

30

例子

shutil 模块中的 move() 函数是用于将文件或目录从一个位置移动到另一个位置的高级函数。它既可以用于重命名(在同一文件系统中移动),也可以用于将文件或目录移动到不同的文件系统或磁盘分区。

以下是 shutil.move() 函数的一个简单示例:

import shutil

# 假设我们有一个文件 example.txt,我们想把它移动到另一个目录
src = 'source_directory/example.txt'
dst = 'destination_directory/example.txt'

# 使用 shutil.move() 移动文件
shutil.move(src, dst)

在这个例子中,shutil.move(src, dst) 会将 src 路径指定的文件移动到 dst 路径。如果 dst 是一个目录,则 src 文件将被移动到该目录下,并保持原有的文件名。如果 dst 是一个不同的文件名,它也可以作为重命名操作使用。

需要注意的是,如果 dst 路径包含不存在的目录,shutil.move() 会抛出一个错误。因此,通常需要确保目标路径中的所有必需目录都已存在,或者可以使用 shutil.move() 的一个变种 shutil.move(src, dst, copy_function),其中 copy_function 是一个用于在移动前复制文件的函数(默认是 shutil.copy2()),并且可以在必要时创建目标目录。

如果要跨磁盘分区移动文件,shutil.move() 会先复制文件,然后再删除原始文件。这是因为在不同的文件系统或磁盘上直接移动文件可能需要不同的操作系统支持。

10.31

编写代码,将当前工作目录修改为“C:\”,并验证,最后将当前工作目录恢复为原来的文件夹。

要修改当前工作目录为 "C:\",可以使用 os.chdir() 函数。要验证当前工作目录,可以使用 os.getcwd() 函数。最后,为了将工作目录恢复到原来的位置,需要记录下原始的工作目录,然后在操作完成后再次使用 os.chdir() 来恢复。

以下是完成这个任务的示例代码:

import os

# 记录当前的工作目录,以便之后可以恢复
original_directory = os.getcwd()

# 修改当前工作目录为 'C:\'
os.chdir('C:\\')

# 验证当前工作目录是否已经改变
print(f"Current working directory is now: {os.getcwd()}")

# 将当前工作目录恢复到修改之前的目录
os.chdir(original_directory)

# 再次验证工作目录是否已经恢复
print(f"Current working directory has been restored to: {os.getcwd()}")

这段代码首先使用 os.getcwd() 获取当前的工作目录,并将其存储在变量 original_directory 中。然后,使用 os.chdir('C:\\') 将当前工作目录修改为 "C:\"。接着,打印出当前工作目录以确认它已经改变。最后,使用 os.chdir(original_directory) 将工作目录恢复到原来的目录,并再次打印出来以确认恢复操作。

注意,这段代码在执行时,如果用户没有足够的权限访问 "C:\" 或者该目录不存在,将会引发一个错误。

os 模块中 chdir()getcwd() 函数的功能表格:

序号

函数/方法

英文全称

所属模块

描述

1

chdir()

change directory

os

修改当前工作目录到指定的路径

2

getcwd()

get current working directory

os

获取当前工作目录的完整路径

10.32

编写程序,用户输人一个文件夹和一个文件名,搜索该文件夹及其子文件夹中是否存在该文件。

用户输入一个文件夹路径和一个文件名,并搜索该文件夹及其所有子文件夹中是否存在该文件,我们可以使用 os.path 模块中的 exists()join() 函数,以及 os 模块中的 walk() 函数。

import os

def search_file_in_directory(directory, filename):
    for dirpath, dirnames, filenames in os.walk(directory):
        if filename in filenames:
            print(f"Found '{filename}' in directory: {dirpath}")
            return True
    print(f"'{filename}' does not exist in the directory or subdirectories.")
    return False

# 用户输入文件夹路径和文件名
folder_path = input("Enter the folder path to search in: ")
file_name = input("Enter the filename to search for: ")

# 调用函数进行搜索
search_file_in_directory(folder_path, file_name)

这个程序的工作流程如下:

  1. 定义了一个函数 search_file_in_directory(directory, filename),它接受一个目录路径和一个文件名作为参数。
  2. 使用 os.walk(directory) 遍历指定目录及其所有子目录。
  3. 对于每个目录,检查提供的文件名是否在当前目录的 filenames 列表中。
  4. 如果找到该文件,打印出文件所在的目录,并返回 True
  5. 如果在所有目录中都没有找到该文件,打印出文件不存在的消息,并返回 False

输入文件夹路径和要搜索的文件名,输出文件是否存在以及它所在的目录。

END