Python实战技巧:一招搞定获取文件夹下所有文件名,提升开发效率
发布时间: 2024-06-21 13:57:45 阅读量: 214 订阅数: 33
![python获取文件夹下所有文件名](https://img-blog.csdnimg.cn/20200523154100211.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01hY3JvQ3VydGFpbg==,size_16,color_FFFFFF,t_70)
# 1. Python文件操作基础
Python提供了一系列强大的函数和模块,用于对文件进行读写、遍历和操作。本章将介绍Python文件操作的基础知识,包括文件打开、关闭、读取、写入和关闭。
### 1.1 文件打开
要打开一个文件,可以使用`open()`函数。该函数接受两个参数:文件名和打开模式。打开模式指定了文件的打开方式,例如只读('r')、只写('w')或读写('r+')。
```python
# 打开一个文件用于读取
file = open("myfile.txt", "r")
# 打开一个文件用于写入
file = open("myfile.txt", "w")
```
# 2. Python文件遍历技巧
文件遍历是文件操作中常见且重要的任务,Python提供了多种方法来遍历文件和文件夹。本节将介绍三种最常用的Python文件遍历技巧:递归遍历、使用os模块遍历和使用glob模块遍历。
### 2.1 递归遍历文件夹获取所有文件
递归遍历是一种深度优先遍历算法,它通过递归函数来遍历文件夹和子文件夹中的所有文件。以下代码展示了如何使用递归遍历来获取文件夹中所有文件的路径:
```python
import os
def get_all_files(directory):
"""
递归遍历文件夹获取所有文件路径。
参数:
directory: 要遍历的文件夹路径。
返回:
一个包含所有文件路径的列表。
"""
files = []
for root, directories, filenames in os.walk(directory):
for filename in filenames:
files.append(os.path.join(root, filename))
return files
```
**代码逻辑逐行解读:**
1. `os.walk(directory)`:使用os模块的walk()函数遍历文件夹及其子文件夹,返回一个包含三个元素的元组:(根目录路径、子目录列表、文件列表)。
2. 对于每个子目录和文件,使用`os.path.join(root, filename)`将根目录路径和文件名连接起来,得到文件的完整路径。
3. 将文件路径添加到`files`列表中。
4. 递归遍历所有子文件夹,直到遍历完整个文件夹结构。
### 2.2 利用os模块遍历文件夹获取所有文件
os模块还提供了另一种遍历文件夹的方法,它使用`os.listdir()`函数获取文件夹中的文件和子文件夹列表。以下代码展示了如何使用os模块遍历文件夹:
```python
import os
def get_all_files_os(directory):
"""
使用os模块遍历文件夹获取所有文件路径。
参数:
directory: 要遍历的文件夹路径。
返回:
一个包含所有文件路径的列表。
"""
files = []
for root, directories, filenames in os.walk(directory):
for filename in filenames:
files.append(os.path.join(root, filename))
return files
```
**代码逻辑逐行解读:**
1. 与递归遍历类似,`os.walk(directory)`遍历文件夹及其子文件夹,返回一个包含三个元素的元组:(根目录路径、子目录列表、文件列表)。
2. 对于每个子目录和文件,使用`os.path.join(root, filename)`将根目录路径和文件名连接起来,得到文件的完整路径。
3. 将文件路径添加到`files`列表中。
### 2.3 使用glob模块遍历文件夹获取所有文件
glob模块提供了通配符匹配功能,可以用于遍历文件夹和匹配特定文件模式。以下代码展示了如何使用glob模块遍历文件夹:
```python
import glob
def get_all_files_glob(directory, pattern="*"):
"""
使用glob模块遍历文件夹获取所有文件路径。
参数:
directory: 要遍历的文件夹路径。
pattern: 要匹配的文件模式(默认为"*",匹配所有文件)。
返回:
一个包含所有匹配文件路径的列表。
"""
files = glob.glob(os.path.join(directory, pattern))
return files
```
**代码逻辑逐行解读:**
1. `glob.glob(os.path.join(directory, pattern))`:使用glob.glob()函数匹配文件夹中符合指定模式的文件。
2. 将匹配的文件路径添加到`files`列表中。
# 3. Python文件操作进阶应用
### 3.1 文件内容读取和写入
#### 3.1.1 文件读取
```python
with open('test.txt', 'r') as f:
content = f.read()
```
**参数说明:**
* `'r'`:打开文件以只读模式。
* `'test.txt'`:要读取的文件路径。
**逻辑分析:**
1. 使用 `open()` 函数以只读模式打开文件。
2. 使用 `read()` 方法读取文件中的所有内容并将其存储在 `content` 变量中。
#### 3.1.2 文件写入
```python
with open('test.txt', 'w') as f:
f.write('Hello, world!')
```
**参数说明:**
* `'w'`:打开文件以写入模式。
* `'test.txt'`:要写入的文件路径。
**逻辑分析:**
1. 使用 `open()` 函数以写入模式打开文件。
2. 使用 `write()` 方法将字符串 `'Hello, world!'` 写入文件。
### 3.2 文件复制、移动和删除
#### 3.2.1 文件复制
```python
import shutil
shutil.copyfile('test.txt', 'test_copy.txt')
```
**参数说明:**
* `shutil.copyfile()`:复制文件函数。
* `'test.txt'`:要复制的文件路径。
* `'test_copy.txt'`:复制后的文件路径。
**逻辑分析:**
1. 导入 `shutil` 模块,它提供了文件操作的实用函数。
2. 使用 `shutil.copyfile()` 函数将 `test.txt` 文件复制到 `test_copy.txt` 文件。
#### 3.2.2 文件移动
```python
import os
os.rename('test.txt', 'test_moved.txt')
```
**参数说明:**
* `os.rename()`:重命名或移动文件函数。
* `'test.txt'`:要移动的文件路径。
* `'test_moved.txt'`:移动后的文件路径。
**逻辑分析:**
1. 导入 `os` 模块,它提供了操作系统相关的函数。
2. 使用 `os.rename()` 函数将 `test.txt` 文件重命名为 `test_moved.txt`,从而将其移动到新位置。
#### 3.2.3 文件删除
```python
import os
os.remove('test.txt')
```
**参数说明:**
* `os.remove()`:删除文件函数。
* `'test.txt'`:要删除的文件路径。
**逻辑分析:**
1. 导入 `os` 模块,它提供了操作系统相关的函数。
2. 使用 `os.remove()` 函数删除 `test.txt` 文件。
### 3.3 文件权限和属性管理
#### 3.3.1 文件权限管理
```python
import os
os.chmod('test.txt', 0o755)
```
**参数说明:**
* `os.chmod()`:更改文件权限函数。
* `'test.txt'`:要更改权限的文件路径。
* `0o755`:文件权限模式,表示所有者具有读写执行权限,组成员具有读执行权限,其他用户具有读执行权限。
**逻辑分析:**
1. 导入 `os` 模块,它提供了操作系统相关的函数。
2. 使用 `os.chmod()` 函数更改 `test.txt` 文件的权限为 0o755,其中:
* 7:所有者权限(读、写、执行)
* 5:组成员权限(读、执行)
* 5:其他用户权限(读、执行)
#### 3.3.2 文件属性管理
```python
import os
statinfo = os.stat('test.txt')
print(statinfo.st_size)
```
**参数说明:**
* `os.stat()`:获取文件属性函数。
* `'test.txt'`:要获取属性的文件路径。
**逻辑分析:**
1. 导入 `os` 模块,它提供了操作系统相关的函数。
2. 使用 `os.stat()` 函数获取 `test.txt` 文件的属性,并将其存储在 `statinfo` 变量中。
3. 访问 `statinfo` 对象的 `st_size` 属性,它返回文件的大小(以字节为单位)。
# 4. Python文件操作实战案例
### 4.1 批量重命名文件
**需求:**在一个文件夹中,将所有以 `.txt` 结尾的文件重命名为 `new_name.txt`。
**步骤:**
1. 导入 `os` 模块。
2. 使用 `os.listdir()` 获取文件夹中的所有文件。
3. 遍历文件列表,检查文件后缀是否为 `.txt`。
4. 如果是,使用 `os.rename()` 将文件重命名为 `new_name.txt`。
**代码:**
```python
import os
# 获取文件夹中的所有文件
files = os.listdir("folder_path")
# 遍历文件列表
for file in files:
# 检查文件后缀是否为 ".txt"
if file.endswith(".txt"):
# 重命名文件
os.rename(file, "new_name.txt")
```
**逻辑分析:**
* `os.listdir()` 函数返回一个包含文件夹中所有文件和子目录名称的列表。
* `for` 循环遍历文件列表,检查每个文件的名称。
* `endswith()` 方法检查文件名称是否以 `.txt` 结尾。
* 如果文件以 `.txt` 结尾,`os.rename()` 函数将文件重命名为 `new_name.txt`。
### 4.2 查找和替换文件内容
**需求:**在一个文件中查找特定字符串并将其替换为另一个字符串。
**步骤:**
1. 打开文件并读取其内容。
2. 使用 `replace()` 方法查找并替换字符串。
3. 将更新后的内容写入文件。
**代码:**
```python
with open("file_path", "r+") as f:
# 读取文件内容
content = f.read()
# 查找并替换字符串
new_content = content.replace("old_string", "new_string")
# 写入更新后的内容
f.seek(0)
f.write(new_content)
```
**逻辑分析:**
* `open()` 函数以读写模式打开文件。
* `read()` 方法读取文件的内容并将其存储在 `content` 变量中。
* `replace()` 方法查找 `old_string` 并将其替换为 `new_string`。
* `seek(0)` 方法将文件指针重置到文件开头。
* `write()` 方法将更新后的内容写入文件。
### 4.3 文件内容统计和分析
**需求:**统计一个文件中单词、字符和行的数量。
**步骤:**
1. 打开文件并读取其内容。
2. 使用 `split()` 方法将内容拆分为单词。
3. 使用 `len()` 函数计算单词、字符和行的数量。
**代码:**
```python
with open("file_path", "r") as f:
# 读取文件内容
content = f.read()
# 拆分单词
words = content.split()
# 计算单词、字符和行的数量
num_words = len(words)
num_chars = len(content)
num_lines = content.count("\n") + 1
print("单词数:", num_words)
print("字符数:", num_chars)
print("行数:", num_lines)
```
**逻辑分析:**
* `split()` 方法将文件内容按空格拆分为单词。
* `len()` 函数计算单词、字符和行的数量。
* `count("\n") + 1` 计算换行符的数量,并将其加 1 以获得行数。
# 5. Python文件操作优化技巧
### 5.1 提高文件遍历效率
**1. 使用 os.scandir() 遍历文件夹**
`os.scandir()` 函数可以返回文件夹中所有文件的元数据,而无需实际读取文件内容。这可以显著提高遍历大型文件夹的效率。
```python
import os
# 遍历文件夹并打印文件名
for entry in os.scandir('my_folder'):
print(entry.name)
```
**2. 并行遍历文件夹**
使用 `concurrent.futures` 模块可以并行遍历文件夹。这可以充分利用多核 CPU,从而加快遍历速度。
```python
import concurrent.futures
def process_file(file_path):
# 对文件执行操作
# 创建线程池
with concurrent.futures.ThreadPoolExecutor() as executor:
# 提交任务并行遍历文件夹
executor.map(process_file, os.listdir('my_folder'))
```
### 5.2 优化文件读取和写入性能
**1. 使用缓冲区**
缓冲区可以减少文件读取和写入时的系统调用次数,从而提高性能。
```python
# 使用缓冲区读取文件
with open('my_file.txt', 'r') as f:
data = f.read()
# 使用缓冲区写入文件
with open('my_file.txt', 'w') as f:
f.write(data)
```
**2. 使用mmap() 内存映射文件**
`mmap()` 函数可以将文件映射到内存,从而允许直接访问文件内容,而无需通过系统调用读取和写入。
```python
import mmap
# 内存映射文件
with open('my_file.txt', 'r') as f:
data = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
```
### 5.3 文件操作异常处理和调试
**1. 使用 try-except 块**
`try-except` 块可以捕获文件操作中的异常,并进行适当的处理。
```python
try:
# 文件操作代码
except Exception as e:
# 异常处理代码
```
**2. 使用 logging 模块**
`logging` 模块可以记录文件操作中的异常和调试信息,便于故障排除。
```python
import logging
# 设置日志级别
logging.basicConfig(level=logging.DEBUG)
# 记录文件操作异常
try:
# 文件操作代码
except Exception as e:
logging.error('文件操作异常:', exc_info=True)
```
0
0