Python文件操作进阶:遍历文件夹及其子文件夹,轻松管理文件结构
发布时间: 2024-06-21 14:01:50 阅读量: 86 订阅数: 34
![Python文件操作进阶:遍历文件夹及其子文件夹,轻松管理文件结构](https://img-blog.csdnimg.cn/img_convert/f13a75196568cd249f3b4cf294fea96f.png)
# 1. Python文件操作基础**
Python提供了丰富的文件操作模块,如`os`和`shutil`,可以轻松地处理文件和文件夹。本章将介绍文件操作的基础知识,包括打开、读取、写入和关闭文件。
首先,需要使用`open()`函数打开一个文件。该函数接受两个参数:文件名和模式。模式指定打开文件的目的,如`'r'`表示只读,`'w'`表示只写,`'a'`表示追加。
打开文件后,可以使用`read()`方法读取文件内容,`write()`方法写入文件内容,`close()`方法关闭文件。`read()`方法返回文件内容的字符串,`write()`方法不返回任何值。
# 2. 遍历文件夹及其子文件夹
### 2.1 递归遍历文件夹
递归遍历文件夹是一种深度优先遍历算法,它会首先遍历当前文件夹中的所有文件和目录,然后递归地遍历每个子文件夹中的文件和目录。
#### 2.1.1 os.walk()函数的用法
Python中可以使用`os.walk()`函数来递归遍历文件夹。`os.walk()`函数返回一个三元组,其中:
* 第一个元素是当前文件夹的路径。
* 第二个元素是一个包含当前文件夹中所有子目录的列表。
* 第三个元素是一个包含当前文件夹中所有文件的列表。
```python
import os
# 遍历当前目录及其子目录
for root, dirs, files in os.walk('.'):
print(f"Current directory: {root}")
print(f"Subdirectories: {dirs}")
print(f"Files: {files}")
```
**代码逻辑逐行解读:**
1. 导入`os`模块。
2. 使用`os.walk('.')`遍历当前目录及其子目录。
3. 对于每个三元组`(root, dirs, files)`:
- 打印当前目录的路径。
- 打印当前目录中的所有子目录。
- 打印当前目录中的所有文件。
#### 2.1.2 遍历子文件夹中的文件和目录
要递归地遍历子文件夹中的文件和目录,可以在`os.walk()`函数的循环中使用嵌套循环:
```python
import os
# 遍历当前目录及其子目录
for root, dirs, files in os.walk('.'):
print(f"Current directory: {root}")
print(f"Subdirectories: {dirs}")
print(f"Files: {files}")
# 遍历当前目录中的子目录
for subdir in dirs:
print(f"Subdirectory: {subdir}")
# 遍历子目录中的文件
for file in os.listdir(subdir):
print(f"File: {file}")
```
**代码逻辑逐行解读:**
1. 导入`os`模块。
2. 使用`os.walk('.')`遍历当前目录及其子目录。
3. 对于每个三元组`(root, dirs, files)`:
- 打印当前目录的路径。
- 打印当前目录中的所有子目录。
- 打印当前目录中的所有文件。
4. 对于当前目录中的每个子目录`subdir`:
- 打印子目录的名称。
5. 对于子目录`subdir`中的每个文件`file`:
- 打印文件的名称。
### 2.2 非递归遍历文件夹
非递归遍历文件夹是一种广度优先遍历算法,它会首先遍历当前文件夹中的所有文件和目录,然后依次遍历每个子文件夹中的文件和目录。
#### 2.2.1 os.listdir()函数的用法
Python中可以使用`os.listdir()`函数来非递归遍历文件夹。`os.listdir()`函数返回一个包含当前文件夹中所有文件和目录的列表。
```python
import os
# 遍历当前目录
for file in os.listdir('.'):
print(f"File or directory: {file}")
```
**代码逻辑逐行解读:**
1. 导入`os`模块。
2. 使用`os.listdir('.')`遍历当前目录。
3. 对于当前目录中的每个文件或目录`file`:
- 打印文件或目录的名称。
#### 2.2.2 使用队列实现非递归遍历
要使用队列实现非递归遍历文件夹,可以将当前文件夹中的所有文件和目录添加到队列中,然后依次从队列中取出文件或目录进行遍历:
```python
import os
from collections import deque
# 创建一个队列
queue = deque()
# 将当前目录中的所有文件和目录添加到队列中
for file in os.listdir('.'):
queue.append(file)
# 遍历队列中的文件和目录
while queue:
# 从队列中取出一个文件或目录
file = queue.popleft()
# 如果是目录,则将其中的所有文件和目录添加到队列中
if os.path.isdir(file):
for subfile in os.listdir(file):
queue.append(os.path.join(file, subfile))
# 如果是文件,则打印文件名称
else:
print(f"File: {file}")
```
**代码逻辑逐行解读:**
1. 导入`os`和`collections.deque`模块。
2. 创建一个队列`queue`。
3. 将当前目录中的所有文件和目录添加到队列中。
4. 遍历队列中的文件和目录:
- 从队列中取出一个文件或目录`file`。
- 如果`file`是目录,则将其中的所有文件和目录添加到队列中。
- 如果`file`是文件,则打印文件名称。
# 3. 管理文件结构
### 3.1 创建和删除文件夹
#### 3.1.1 os.makedirs()函数的用法
`os.makedirs()`函数用于创建多级目录。语法如下:
```python
os.makedirs(path, exist_ok=False)
```
* **path**:要创建的目录路径。
* **exist_ok**:如果目录已存在,是否引发异常。默认值为`False`,表示如果目录已存在,将引发`FileExistsError`异常。
**代码块:**
```python
import os
# 创建多级目录
os.makedirs('my_directory/sub_directory/sub_sub_directory')
```
**逻辑分析:**
该代码块使用`os.makedirs()`函数创建名为`my_directory/sub_directory/sub_sub_directory`的多级目录。如果目录已存在,将引发`FileExistsError`异常。
#### 3.1.2 os.rmdir()函数的用法
`os.rmdir()`函数用于删除空目录。语法如下:
```python
os.rmdir(path)
```
* **path**:要删除的目录路径。
**代码块:**
```python
import os
# 删除空目录
os.rmdir('my_directory/sub_directory')
```
**逻辑分析:**
该代码块使用`os.rmdir()`函数删除名为`my_directory/sub_directory`的空目录。如果目录不为空或不存在,将引发`OSError`异常。
### 3.2 移动和重命名文件
#### 3.2.1 os.rename()函数的用法
`os.rename()`函数用于移动或重命名文件。语法如下:
```python
os.rename(src, dst)
```
* **src**:要移动或重命名的文件路径。
* **dst**:目标文件路径。
**代码块:**
```python
import os
# 移动文件
os.rename('old_file.txt', 'new_file.txt')
# 重命名文件
os.rename('file.txt', 'file_renamed.txt')
```
**逻辑分析:**
该代码块使用`os.rename()`函数移动文件`old_file.txt`到`new_file.txt`,并重命名文件`file.txt`为`file_renamed.txt`。
#### 3.2.2 os.replace()函数的用法
`os.replace()`函数用于原子地移动或重命名文件。语法如下:
```python
os.replace(src, dst)
```
* **src**:要移动或重命名的文件路径。
* **dst**:目标文件路径。
**代码块:**
```python
import os
# 原子地移动文件
os.replace('old_file.txt', 'new_file.txt')
# 原子地重命名文件
os.replace('file.txt', 'file_renamed.txt')
```
**逻辑分析:**
该代码块使用`os.replace()`函数原子地移动文件`old_file.txt`到`new_file.txt`,并原子地重命名文件`file.txt`为`file_renamed.txt`。原子操作保证了文件操作的完整性和一致性。
### 3.3 复制文件
#### 3.3.1 shutil.copyfile()函数的用法
`shutil.copyfile()`函数用于复制文件。语法如下:
```python
shutil.copyfile(src, dst)
```
* **src**:要复制的文件路径。
* **dst**:目标文件路径。
**代码块:**
```python
import shutil
# 复制文件
shutil.copyfile('file1.txt', 'file2.txt')
```
**逻辑分析:**
该代码块使用`shutil.copyfile()`函数复制文件`file1.txt`到`file2.txt`。
#### 3.3.2 shutil.copytree()函数的用法
`shutil.copytree()`函数用于复制目录及其子目录和文件。语法如下:
```python
shutil.copytree(src, dst)
```
* **src**:要复制的目录路径。
* **dst**:目标目录路径。
**代码块:**
```python
import shutil
# 复制目录
shutil.copytree('directory1', 'directory2')
```
**逻辑分析:**
该代码块使用`shutil.copytree()`函数复制目录`directory1`及其子目录和文件到`directory2`。
# 4. 进阶文件操作技巧
### 4.1 文件内容处理
#### 4.1.1 读写文件内容
文件内容的读写是文件操作中最基本的操作。Python提供了多种方法来读写文件内容。
**读取文件内容**
```python
with open('file.txt', 'r') as f:
content = f.read()
```
**写入文件内容**
```python
with open('file.txt', 'w') as f:
f.write('Hello, world!')
```
**参数说明:**
- `open()` 函数的第一个参数指定要打开的文件路径。
- `'r'` 表示以只读模式打开文件。
- `'w'` 表示以只写模式打开文件。
- `with` 语句确保在处理文件后自动关闭文件。
#### 4.1.2 追加和截断文件内容
除了读写文件内容,Python还允许追加和截断文件内容。
**追加文件内容**
```python
with open('file.txt', 'a') as f:
f.write('This is a new line.')
```
**截断文件内容**
```python
with open('file.txt', 'w') as f:
f.truncate()
```
**参数说明:**
- `'a'` 表示以追加模式打开文件。
- `truncate()` 方法将文件内容截断为 0 字节。
### 4.2 文件属性操作
#### 4.2.1 获取文件属性
Python提供了多种方法来获取文件属性,例如文件大小、修改时间和访问权限。
```python
import os
file_path = 'file.txt'
# 获取文件大小
file_size = os.path.getsize(file_path)
# 获取文件修改时间
file_mtime = os.path.getmtime(file_path)
# 获取文件访问权限
file_perms = os.path.getmode(file_path)
```
**参数说明:**
- `os.path.getsize()` 返回文件大小(以字节为单位)。
- `os.path.getmtime()` 返回文件最后修改时间(以时间戳为单位)。
- `os.path.getmode()` 返回文件访问权限(以八进制数字表示)。
#### 4.2.2 修改文件属性
在某些情况下,您可能需要修改文件属性。Python允许您修改文件修改时间和访问权限。
```python
import os
file_path = 'file.txt'
# 修改文件修改时间
os.utime(file_path, (1654041600, 1654041600))
# 修改文件访问权限
os.chmod(file_path, 0o644)
```
**参数说明:**
- `os.utime()` 函数接受一个文件路径和一个包含新修改时间和访问时间的元组。
- `os.chmod()` 函数接受一个文件路径和一个八进制数字,表示新的访问权限。
### 4.3 文件搜索和过滤
#### 4.3.1 glob.glob() 函数的用法
`glob.glob()` 函数用于搜索与给定模式匹配的文件。
```python
import glob
# 搜索所有以 .txt 结尾的文件
files = glob.glob('*.txt')
```
**参数说明:**
- `glob.glob()` 函数接受一个模式字符串,表示要搜索的文件。
#### 4.3.2 fnmatch.fnmatch() 函数的用法
`fnmatch.fnmatch()` 函数用于测试一个文件名是否与给定的模式匹配。
```python
import fnmatch
# 测试一个文件名是否与模式匹配
result = fnmatch.fnmatch('file.txt', '*.txt')
```
**参数说明:**
- `fnmatch.fnmatch()` 函数接受一个文件名和一个模式字符串。
# 5. 实践应用案例
### 5.1 自动化文件归档
**目标:**
编写一个脚本,自动将特定文件夹中的文件归档到指定位置。
**步骤:**
1. **导入必要的模块:**
```python
import os
import shutil
import zipfile
```
2. **定义要归档的文件夹和目标位置:**
```python
source_dir = "path/to/source_folder"
target_dir = "path/to/target_folder"
```
3. **遍历源文件夹中的文件:**
```python
for root, dirs, files in os.walk(source_dir):
for file in files:
# 获取文件的绝对路径
file_path = os.path.join(root, file)
```
4. **创建归档文件:**
```python
with zipfile.ZipFile(os.path.join(target_dir, "archive.zip"), "w") as zip_file:
# 将文件添加到归档文件中
zip_file.write(file_path, os.path.relpath(file_path, source_dir))
```
### 5.2 文件系统监控和备份
**目标:**
创建一个监控文件系统更改的脚本,并在检测到更改时备份受影响的文件。
**步骤:**
1. **导入必要的模块:**
```python
import os
import time
import shutil
```
2. **定义要监控的文件夹:**
```python
watch_dir = "path/to/watch_folder"
```
3. **获取初始文件列表:**
```python
initial_files = os.listdir(watch_dir)
```
4. **进入监控循环:**
```python
while True:
# 获取当前文件列表
current_files = os.listdir(watch_dir)
# 比较当前文件列表和初始文件列表
added_files = set(current_files) - set(initial_files)
removed_files = set(initial_files) - set(current_files)
# 处理添加和删除的文件
for file in added_files:
shutil.copy(os.path.join(watch_dir, file), "path/to/backup_folder")
for file in removed_files:
# 处理删除的文件
pass
# 更新初始文件列表
initial_files = current_files
# 等待一段时间后再重新检查
time.sleep(1)
```
### 5.3 文件内容处理和转换
**目标:**
编写一个脚本,将特定格式的文件内容转换为另一种格式。
**步骤:**
1. **导入必要的模块:**
```python
import os
import csv
import json
```
2. **定义要转换的文件和目标格式:**
```python
input_file = "path/to/input.csv"
output_file = "path/to/output.json"
```
3. **读取 CSV 文件:**
```python
with open(input_file, "r") as csv_file:
reader = csv.reader(csv_file)
data = list(reader)
```
4. **将数据转换为 JSON:**
```python
json_data = json.dumps(data)
```
5. **写入 JSON 文件:**
```python
with open(output_file, "w") as json_file:
json_file.write(json_data)
```
0
0