4.7 Python3 OS 文件/目录方法

os 模块是 Python 中用于与操作系统交互的标准库模块,提供了丰富的文件/目录操作方法。


目录

1. 文件操作

1. 基本文件操作

1.1 打开和关闭文件

1.2 文件打开模式

2. 读写文件内容

2.1 读取文件

2.2 写入文件

3. 文件定位

4. 文件信息与操作

使用 os 模块

5. 高级文件操作

5.1 二进制文件操作

5.2 临时文件

6. 文件编码处理

7. 文件锁(跨进程同步)

2. 目录操作

1. 检查目录是否存在

2. 创建目录

2.1  创建单个目录

2.2  创建多级目录(递归创建)

3. 删除目录

3.1  删除空目录

3.2  删除非空目录(递归删除)

4. 遍历目录

4.1  列出目录下的所有文件和子目录

4.2  递归遍历所有文件和子目录

5. 获取当前工作目录

6. 使用 pathlib(更现代的目录操作方式)

3. 高级操作


1. 文件操作

Python 提供了多种方式进行文件操作,主要包括内置的 open() 函数和 os 模块中的相关方法。

1. 基本文件操作

1.1 打开和关闭文件

# 使用 open() 函数打开文件(推荐使用 with 语句自动关闭文件)
with open('example.txt', 'r', encoding='utf-8') as file:
    content = file.read()
    print(content)


print("-----------------------")
# 传统方式(需要手动关闭)
file = open('example.txt', 'r', encoding='utf-8')
try:
    content = file.read()
    print(content)
finally:
    file.close()

1.2 文件打开模式

模式描述
'r'只读(默认)
'w'写入,会覆盖已有文件
'x'独占创建,文件已存在则失败
'a'追加,写入到文件末尾
'b'二进制模式
't'文本模式(默认)
'+'更新(可读可写)

2. 读写文件内容

2.1 读取文件


print("-----------------------")
# 读取整个文件
with open('example.txt', 'r', encoding='utf-8') as file:
    content = file.read()
    print(content)
print("-----------------------")

# 逐行读取
with open('example.txt', 'r', encoding='utf-8') as file:
    for line in file:
        print(line, end='')
print("-----------------------")

# 读取所有行到列表
with open('example.txt', 'r', encoding='utf-8') as file:
    lines = file.readlines()
    print(lines)
print("-----------------------")

2.2 写入文件


print("-----------------------")
# 写入字符串
with open('output1.txt', 'w', encoding='utf-8') as file:
    file.write("Hello, World!\n")
    file.write("This is a new line.")
print("-----------------------")

# 写入多行
lines = ["Line 1\n", "Line 2\n", "Line 3\n"]
with open('output2.txt', 'w', encoding='utf-8') as file:
    file.writelines(lines)
print("-----------------------")

3. 文件定位


with open('example.txt', 'r+', encoding='utf-8') as file:
    # 获取当前位置
    position = file.tell()
    print(f"Current position: {position}")
    
    # 读取前5个字符
    print(file.read(5))
    
    # 移动到文件开头
    file.seek(0)
    
    # 读取第一行
    print(file.readline())
    
    # 移动到文件末尾
    file.seek(0, 2)
    file.write("\nAppended text")

4. 文件信息与操作

使用 os 模块

import os

# 重命名文件
os.rename('old.txt', 'new.txt')

# 删除文件
os.remove('file_to_delete.txt')

# 获取文件大小(字节)
size = os.path.getsize('example.txt')
print(f"File size: {size} bytes")

# 获取文件修改时间(时间戳)
mtime = os.path.getmtime('example.txt')
from datetime import datetime
print(f"Last modified: {datetime.fromtimestamp(mtime)}")

# 检查文件是否存在
if os.path.exists('example.txt'):
    print("File exists")

5. 高级文件操作

5.1 二进制文件操作

# 读取二进制文件
with open('image.jpg', 'rb') as file:
    data = file.read()

# 写入二进制文件
with open('copy.jpg', 'wb') as file:
    file.write(data)

5.2 临时文件

import tempfile

# 创建临时文件
with tempfile.NamedTemporaryFile(delete=False) as temp:
    temp.write(b"Some temporary data")
    temp_path = temp.name

# 使用后可以手动删除
os.unlink(temp_path)

6. 文件编码处理

# 指定编码读写文件(Python 3默认使用utf-8)
with open('example.txt', 'r', encoding='utf-8') as file:
    content = file.read()

# 处理编码错误
try:
    with open('example.txt', 'r', encoding='utf-8') as file:
        content = file.read()
except UnicodeDecodeError:
    with open('example.txt', 'r', encoding='gbk') as file:
        content = file.read()

7. 文件锁(跨进程同步)

import fcntl  # Unix系统

with open('lockfile', 'w') as f:
    try:
        fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB)  # 非阻塞排他锁
        # 执行需要同步的操作
    except IOError:
        print("Could not acquire lock")
    finally:
        fcntl.flock(f, fcntl.LOCK_UN)  # 释放锁

2. 目录操作

在 Python 中,可以使用 os 和 pathlib 模块进行目录操作。

1. 检查目录是否存在

import os

dir_path = "my_directory"

if os.path.exists(dir_path):
    print(f"目录 '{dir_path}' 存在")
else:
    print(f"目录 '{dir_path}' 不存在")

2. 创建目录

2.1  创建单个目录

import os

dir_path = "my_directory"

if not os.path.exists(dir_path):
    os.mkdir(dir_path)  # 创建单层目录
    print(f"目录 '{dir_path}' 创建成功")
else:
    print(f"目录 '{dir_path}' 已存在")

2.2  创建多级目录(递归创建)

import os

dir_path = "parent_dir/child_dir/grandchild_dir"

if not os.path.exists(dir_path):
    os.makedirs(dir_path)  # 递归创建多级目录
    print(f"目录 '{dir_path}' 创建成功")
else:
    print(f"目录 '{dir_path}' 已存在")

3. 删除目录

3.1  删除空目录

import os

dir_path = "empty_dir"

if os.path.exists(dir_path):
    os.rmdir(dir_path)  # 只能删除空目录
    print(f"目录 '{dir_path}' 已删除")
else:
    print(f"目录 '{dir_path}' 不存在")

3.2  删除非空目录(递归删除)

import shutil

dir_path = "non_empty_dir"

if os.path.exists(dir_path):
    shutil.rmtree(dir_path)  # 递归删除整个目录(包括子目录和文件)
    print(f"目录 '{dir_path}' 已删除")
else:
    print(f"目录 '{dir_path}' 不存在")

4. 遍历目录

4.1  列出目录下的所有文件和子目录

import os

dir_path = "my_directory"

if os.path.exists(dir_path):
    entries = os.listdir(dir_path)  # 返回文件和目录名列表
    print(f"目录 '{dir_path}' 下的内容:")
    for entry in entries:
        print(entry)
else:
    print(f"目录 '{dir_path}' 不存在")

4.2  递归遍历所有文件和子目录

import os

dir_path = "my_directory"

if os.path.exists(dir_path):
    for root, dirs, files in os.walk(dir_path):
        print(f"当前目录: {root}")
        print(f"子目录: {dirs}")
        print(f"文件: {files}")
else:
    print(f"目录 '{dir_path}' 不存在")

5. 获取当前工作目录

import os

current_dir = os.getcwd()  # 获取当前工作目录
print(f"当前工作目录: {current_dir}")

# 修改当前工作目录
os.chdir("new_directory")
print(f"新工作目录: {os.getcwd()}")

6. 使用 pathlib(更现代的目录操作方式)

from pathlib import Path

# 创建目录
dir_path = Path("my_directory")
dir_path.mkdir(exist_ok=True)  # exist_ok=True 防止目录已存在时报错

# 检查目录是否存在
if dir_path.exists():
    print(f"目录 '{dir_path}' 存在")

# 遍历目录
for file in dir_path.glob("*"):  # 匹配所有文件/目录
    print(file)

# 删除目录(必须为空)
dir_path.rmdir()

3. 高级操作

  1. 权限管理

    os.chmod('file.txt', 0o755)  # 修改文件权限
    os.chown('file.txt', uid, gid)  # 修改文件所有者(Unix)
  2. 进程管理

    os.system('ls -l')  # 执行系统命令
    os.environ  # 获取环境变量
    os.getpid()  # 获取当前进程ID
  3. 特殊路径

    os.path.expanduser('~/file.txt')  # 扩展用户目录
    os.path.expandvars('$PATH/file.txt')  # 扩展环境变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值