11.python文件

文章目录

      • [Python 文件 I/O 总结](#Python 文件 I/O 总结)
        • [1. **打印到屏幕**](#1. 打印到屏幕)
        • [2. **读取键盘输入**](#2. 读取键盘输入)
        • [3. **打开和关闭文件**](#3. 打开和关闭文件)
          • [3.1 `open()` 函数](#3.1 open() 函数)
          • [3.2 `close()` 方法](#3.2 close() 方法)
        • [4. **文件读写操作**](#4. 文件读写操作)
          • [4.1 `write()` 方法](#4.1 write() 方法)
          • [4.2 `read()` 方法](#4.2 read() 方法)
          • [4.3 `readline()` 方法](#4.3 readline() 方法)
          • [4.4 `readlines()` 方法](#4.4 readlines() 方法)
          • [4.5 `seek()` 和 `tell()` 方法](#4.5 seek()tell() 方法)
        • [5. **文件重命名和删除**](#5. 文件重命名和删除)
          • [5.1 `os.rename()` 方法](#5.1 os.rename() 方法)
          • [5.2 `os.remove()` 方法](#5.2 os.remove() 方法)
        • [6. **目录操作**](#6. 目录操作)
          • [6.1 `os.mkdir()` 方法](#6.1 os.mkdir() 方法)
          • [6.2 `os.chdir()` 方法](#6.2 os.chdir() 方法)
          • [6.3 `os.getcwd()` 方法](#6.3 os.getcwd() 方法)
          • [6.4 `os.rmdir()` 方法](#6.4 os.rmdir() 方法)
          • [6.5 `os.listdir()` 方法](#6.5 os.listdir() 方法)
        • [7. **上下文管理器 (`with` 语句)**](#7. 上下文管理器 (with 语句))
        • [8. **文件对象的属性**](#8. 文件对象的属性)
        • [9. **文件和目录的高级操作**](#9. 文件和目录的高级操作)
      • 总结
      • [1. **文件对象的底层机制**](#1. 文件对象的底层机制)
        • [1.1 文件描述符(File Descriptor)](#1.1 文件描述符(File Descriptor))
        • [1.2 缓冲区(Buffering)](#1.2 缓冲区(Buffering))
        • [1.3 文件对象的状态](#1.3 文件对象的状态)
      • [2. **文件读写的高级技巧**](#2. 文件读写的高级技巧)
        • [2.1 使用 `with` 语句管理文件](#2.1 使用 with 语句管理文件)
        • [2.2 逐块读取大文件](#2.2 逐块读取大文件)
        • [2.3 使用 `pathlib` 模块简化路径操作](#2.3 使用 pathlib 模块简化路径操作)
        • [2.4 使用 `shutil` 模块进行高级文件操作](#2.4 使用 shutil 模块进行高级文件操作)
      • [3. **文件锁定与并发控制**](#3. 文件锁定与并发控制)
        • [3.1 使用 `fcntl` 模块进行文件锁定(Unix/Linux 系统)](#3.1 使用 fcntl 模块进行文件锁定(Unix/Linux 系统))
        • [3.2 使用 `msvcrt` 模块进行文件锁定(Windows 系统)](#3.2 使用 msvcrt 模块进行文件锁定(Windows 系统))
        • [3.3 使用 `filelock` 库简化文件锁定](#3.3 使用 filelock 库简化文件锁定)
      • [4. **异步文件I/O**](#4. 异步文件I/O)
        • [4.1 安装 `aiofiles` 库](#4.1 安装 aiofiles 库)
        • [4.2 异步读写文件](#4.2 异步读写文件)
      • [5. **文件编码与字符集**](#5. 文件编码与字符集)
        • [5.1 指定文件编码](#5.1 指定文件编码)
        • [5.2 处理编码错误](#5.2 处理编码错误)
      • [6. **文件权限与安全性**](#6. 文件权限与安全性)
        • [6.1 设置文件权限](#6.1 设置文件权限)
        • [6.2 获取文件权限](#6.2 获取文件权限)
        • [6.3 检查文件权限](#6.3 检查文件权限)
      • [7. **文件系统监控**](#7. 文件系统监控)
        • [7.1 安装 `watchdog` 库](#7.1 安装 watchdog 库)
        • [7.2 监控文件系统事件](#7.2 监控文件系统事件)
      • 总结

Python 文件 I/O 总结

Python 提供了强大的文件输入输出(I/O)功能,使得你可以轻松地读取、写入和管理文件。以下是关于Python文件I/O的详细总结,涵盖了基本操作、高级特性以及与操作系统交互的方法。


1. 打印到屏幕

最简单的输出方法是使用 print 函数,它可以接受零个或多个用逗号隔开的表达式,并将它们转换为字符串后输出到标准输出(通常是终端或控制台)。

python 复制代码
print("Python 是一个非常棒的语言,不是吗?")

输出:

Python 是一个非常棒的语言,不是吗?

2. 读取键盘输入

Python提供了两种内置函数来从标准输入(通常是键盘)读取用户输入:

  • input():读取用户输入并尝试将其作为Python表达式进行求值。适用于需要处理表达式的场景。
  • input(prompt):带有提示信息的版本。
python 复制代码
user_input = input("请输入:")
print(f"你输入的内容是: {user_input}")

示例:

请输入:Hello Python!
你输入的内容是: Hello Python!

注意: 在Python 3中,raw_input()已被移除,input()的行为等同于Python 2中的raw_input()。如果你想在Python 3中读取原始字符串而不进行求值,直接使用input()即可。


3. 打开和关闭文件

要对文件进行读写操作,首先需要使用 open() 函数打开文件,返回一个文件对象。完成操作后,应使用 close() 方法关闭文件以释放资源。

3.1 open() 函数
python 复制代码
file_object = open(file_name, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
  • file_name:文件的路径和名称。

  • mode :文件的打开模式,默认为 'r'(只读文本模式)。常见模式如下:

    • 'r':只读模式(默认),文件必须存在。
    • 'w':写入模式,如果文件存在则清空内容,不存在则创建新文件。
    • 'a':追加模式,文件指针位于文件末尾,写入时不会覆盖原有内容。
    • 'b':二进制模式,通常与 'r''w''a' 结合使用。
    • '+':读写模式,允许同时读取和写入文件。
    • 'x':新建文件模式,如果文件已存在则抛出 FileExistsError
    • 't':文本模式(默认),用于处理文本文件。
    • 'U':通用换行模式(不推荐使用)。
  • buffering :缓冲区大小。0 表示无缓冲,1 表示行缓冲,负数表示使用系统默认缓冲。

  • encoding :文件的编码格式,默认为 None(系统默认编码)。

  • errors :处理编码错误的方式,如 'strict'(默认)、'ignore''replace' 等。

  • newline :控制换行符的处理方式,None 表示使用系统默认换行符。

  • closefd :是否关闭文件描述符,默认为 True

  • opener :自定义打开文件的方式,默认为 None

3.2 close() 方法
python 复制代码
file_object.close()

关闭文件,释放资源。建议使用 with 语句来自动管理文件的打开和关闭,这样可以确保即使发生异常,文件也会被正确关闭。

python 复制代码
with open('example.txt', 'r') as file:
    content = file.read()
    print(content)
# 文件会在 with 语句块结束后自动关闭

4. 文件读写操作
4.1 write() 方法

用于将字符串或字节数据写入文件。注意,write() 不会自动添加换行符。

python 复制代码
with open('example.txt', 'w') as file:
    file.write("Hello, World!\n")
    file.write("This is a new line.")
4.2 read() 方法

用于从文件中读取指定数量的字节或字符。如果不指定参数,则读取整个文件。

python 复制代码
with open('example.txt', 'r') as file:
    content = file.read(10)  # 读取前10个字符
    print(content)
4.3 readline() 方法

用于逐行读取文件内容,返回一行字符串。

python 复制代码
with open('example.txt', 'r') as file:
    line = file.readline()  # 读取一行
    print(line)
4.4 readlines() 方法

用于读取文件的所有行,并返回一个包含各行的列表。

python 复制代码
with open('example.txt', 'r') as file:
    lines = file.readlines()  # 读取所有行
    for line in lines:
        print(line.strip())  # 去掉每行末尾的换行符
4.5 seek()tell() 方法
  • seek(offset, whence=0) :移动文件指针到指定位置。offset 是偏移量,whence 指定参考点(0 表示文件开头,1 表示当前位置,2 表示文件末尾)。
  • tell():返回当前文件指针的位置。
python 复制代码
with open('example.txt', 'r+') as file:
    print(file.tell())  # 输出: 0
    file.seek(5)  # 移动到第6个字符
    print(file.tell())  # 输出: 5
    file.write("New text")  # 从第6个字符开始写入

5. 文件重命名和删除

Python的 os 模块提供了文件和目录的操作功能。

5.1 os.rename() 方法

用于重命名文件或目录。

python 复制代码
import os

os.rename('old_name.txt', 'new_name.txt')
5.2 os.remove() 方法

用于删除文件。

python 复制代码
import os

os.remove('file_to_delete.txt')

6. 目录操作

os 模块还提供了对目录的操作功能。

6.1 os.mkdir() 方法

用于创建新目录。

python 复制代码
import os

os.mkdir('new_directory')
6.2 os.chdir() 方法

用于更改当前工作目录。

python 复制代码
import os

os.chdir('/path/to/new/directory')
6.3 os.getcwd() 方法

用于获取当前工作目录。

python 复制代码
import os

print(os.getcwd())
6.4 os.rmdir() 方法

用于删除空目录。

python 复制代码
import os

os.rmdir('empty_directory')
6.5 os.listdir() 方法

用于列出指定目录下的所有文件和子目录。

python 复制代码
import os

for item in os.listdir('.'):
    print(item)

7. 上下文管理器 (with 语句)

使用 with 语句可以更安全地管理文件操作,确保文件在使用完毕后自动关闭,即使发生异常也不会导致文件未关闭的问题。

python 复制代码
with open('example.txt', 'r') as file:
    content = file.read()
    print(content)
# 文件会在 with 语句块结束后自动关闭

8. 文件对象的属性

文件对象有一些有用的属性,可以帮助你获取文件的相关信息:

  • file.closed:布尔值,表示文件是否已关闭。
  • file.mode :文件的打开模式(如 'r''w' 等)。
  • file.name:文件的名称。
  • file.encoding:文件的编码格式(仅适用于文本模式)。
python 复制代码
with open('example.txt', 'r') as file:
    print(f"文件名: {file.name}")
    print(f"是否已关闭: {file.closed}")
    print(f"访问模式: {file.mode}")
    print(f"编码格式: {file.encoding}")

9. 文件和目录的高级操作

除了基本的文件和目录操作外,Python还提供了更多高级功能,例如递归遍历目录、复制文件、移动文件等。这些功能可以通过 os 模块和 shutil 模块来实现。

  • os.walk():递归遍历目录树。
  • shutil.copy():复制文件。
  • shutil.move():移动文件或目录。
  • shutil.rmtree():递归删除目录及其内容。

总结

Python的文件I/O功能非常强大且灵活,能够满足各种文件处理需求。通过掌握 open()read()write()seek()tell() 等基本方法,以及 osshutil 模块提供的高级功能,你可以轻松地进行文件的读取、写入、重命名、删除和目录管理等操作。使用 with 语句可以确保文件的安全关闭,避免资源泄漏问题。

如果你有更多具体的问题或需要进一步的解释,请随时告诉我!

理解您希望获得更详细和深刻的Python文件I/O讲解。接下来,我将深入探讨一些高级主题、最佳实践以及Python文件I/O的内部工作原理,帮助您更好地理解和掌握这一重要领域。

1. 文件对象的底层机制

1.1 文件描述符(File Descriptor)

在操作系统层面,每个打开的文件都由一个唯一的整数标识,称为文件描述符 (file descriptor)。Python的文件对象实际上是对这些文件描述符的封装。当你使用 open() 函数打开文件时,Python会调用操作系统的系统调用来获取文件描述符,并将其包装在一个文件对象中。

python 复制代码
with open('example.txt', 'r') as file:
    # 文件对象内部维护了一个文件描述符
    print(file.fileno())  # 输出文件描述符的整数值
1.2 缓冲区(Buffering)

文件I/O操作通常涉及缓冲区,以提高性能。缓冲区的作用是减少与磁盘或网络的实际交互次数。Python提供了三种缓冲模式:

  • 无缓冲(buffering=0:每次写入或读取操作都会直接与磁盘或网络进行交互,适用于需要实时性的情况。
  • 行缓冲(buffering=1:只有当遇到换行符时才会刷新缓冲区,适用于文本文件。
  • 全缓冲(buffering>1buffering=-1:缓冲区大小为指定值(或系统默认值),只有当缓冲区满时才会刷新。
python 复制代码
# 无缓冲
with open('example.txt', 'w', buffering=0) as file:
    file.write("No buffering\n")

# 行缓冲
with open('example.txt', 'w', buffering=1) as file:
    file.write("Line buffering\n")

# 全缓冲
with open('example.txt', 'w', buffering=4096) as file:
    file.write("Full buffering\n")
1.3 文件对象的状态

文件对象有几种重要的状态属性,可以通过以下方法访问:

  • file.closed:布尔值,表示文件是否已关闭。
  • file.mode:字符串,表示文件的打开模式。
  • file.name:字符串,表示文件的名称。
  • file.encoding:字符串,表示文件的编码格式(仅适用于文本模式)。
  • file.newlines :表示文件中使用的换行符(如 \n\r\n 等)。
  • file.buffer:返回底层的二进制缓冲区对象(适用于文本模式)。
  • file.raw:返回最底层的原始文件对象(适用于二进制模式)。
python 复制代码
with open('example.txt', 'r', encoding='utf-8') as file:
    print(f"文件名: {file.name}")
    print(f"是否已关闭: {file.closed}")
    print(f"访问模式: {file.mode}")
    print(f"编码格式: {file.encoding}")
    print(f"换行符: {file.newlines}")

2. 文件读写的高级技巧

2.1 使用 with 语句管理文件

with 语句不仅确保文件在使用完毕后自动关闭,还能捕获并处理异常,避免资源泄漏。它通过上下文管理器协议(Context Manager Protocol)实现。

python 复制代码
try:
    with open('example.txt', 'r') as file:
        content = file.read()
        print(content)
except FileNotFoundError:
    print("文件不存在")
except IOError:
    print("发生I/O错误")
finally:
    print("文件操作结束")
2.2 逐块读取大文件

对于非常大的文件,一次性读取整个文件可能会消耗大量内存。可以使用 read() 方法结合循环逐块读取文件内容,或者使用 for 循环逐行读取。

python 复制代码
# 逐块读取
chunk_size = 8192  # 每次读取8KB
with open('large_file.txt', 'r') as file:
    while True:
        chunk = file.read(chunk_size)
        if not chunk:
            break
        process_chunk(chunk)

# 逐行读取
with open('large_file.txt', 'r') as file:
    for line in file:
        process_line(line.strip())
2.3 使用 pathlib 模块简化路径操作

pathlib 是 Python 3.4 引入的一个模块,提供了一种面向对象的方式来处理文件路径。相比传统的 os.path 模块,pathlib 更加直观和易用。

python 复制代码
from pathlib import Path

# 获取当前目录
current_dir = Path.cwd()
print(current_dir)

# 创建新文件
new_file = Path('example.txt')
new_file.touch()

# 检查文件是否存在
if new_file.exists():
    print("文件存在")

# 读取文件内容
content = new_file.read_text(encoding='utf-8')
print(content)

# 写入文件内容
new_file.write_text("Hello, World!", encoding='utf-8')

# 获取文件的父目录
parent_dir = new_file.parent
print(parent_dir)

# 获取文件的绝对路径
absolute_path = new_file.resolve()
print(absolute_path)

# 遍历目录中的所有文件
for file in Path('.').glob('*.txt'):
    print(file)
2.4 使用 shutil 模块进行高级文件操作

shutil 模块提供了更高层次的文件和目录操作功能,适合处理复杂的文件系统任务,如复制、移动、删除等。

  • shutil.copy(src, dst):复制文件。
  • shutil.move(src, dst):移动文件或目录。
  • shutil.rmtree(path):递归删除目录及其内容。
  • shutil.make_archive(base_name, format, root_dir) :创建压缩文件(如 .zip.tar 等)。
  • shutil.unpack_archive(filename, extract_dir):解压文件。
python 复制代码
import shutil

# 复制文件
shutil.copy('source.txt', 'destination.txt')

# 移动文件
shutil.move('source.txt', '/path/to/new/location/')

# 删除目录及其内容
shutil.rmtree('/path/to/directory')

# 创建压缩文件
shutil.make_archive('archive', 'zip', '/path/to/directory')

# 解压文件
shutil.unpack_archive('archive.zip', '/path/to/extract/')

3. 文件锁定与并发控制

在多线程或多进程环境中,多个程序可能同时访问同一个文件。为了避免数据竞争和不一致,可以使用文件锁定机制来确保文件的独占访问。

3.1 使用 fcntl 模块进行文件锁定(Unix/Linux 系统)

fcntl 模块提供了对文件描述符的低级控制,包括文件锁定功能。它可以用于实现独占锁(exclusive lock)和共享锁(shared lock)。

python 复制代码
import fcntl
import os

with open('example.txt', 'r+') as file:
    try:
        # 获取独占锁
        fcntl.flock(file.fileno(), fcntl.LOCK_EX)
        print("文件已锁定,开始写入...")
        file.write("Some data\n")
        # 释放锁
        fcntl.flock(file.fileno(), fcntl.LOCK_UN)
        print("文件解锁")
    except IOError:
        print("无法锁定文件")
3.2 使用 msvcrt 模块进行文件锁定(Windows 系统)

在 Windows 系统上,可以使用 msvcrt 模块来实现类似的文件锁定功能。

python 复制代码
import msvcrt
import os

with open('example.txt', 'r+') as file:
    try:
        # 获取独占锁
        msvcrt.locking(file.fileno(), msvcrt.LK_LOCK, os.path.getsize('example.txt'))
        print("文件已锁定,开始写入...")
        file.write("Some data\n")
        # 释放锁
        msvcrt.locking(file.fileno(), msvcrt.LK_UNLCK, os.path.getsize('example.txt'))
        print("文件解锁")
    except IOError:
        print("无法锁定文件")
3.3 使用 filelock 库简化文件锁定

filelock 是一个第三方库,提供了一个简单且跨平台的文件锁定机制。它可以在不同操作系统上一致地工作。

bash 复制代码
pip install filelock
python 复制代码
from filelock import FileLock

with FileLock("example.txt.lock"):
    with open("example.txt", "r+") as file:
        print("文件已锁定,开始写入...")
        file.write("Some data\n")
        print("文件解锁")

4. 异步文件I/O

Python 3.5 引入了 asyncio 模块,支持异步编程。通过 aiofiles 库,可以在异步环境中进行文件I/O操作,从而提高程序的并发性能。

4.1 安装 aiofiles
bash 复制代码
pip install aiofiles
4.2 异步读写文件
python 复制代码
import asyncio
import aiofiles

async def read_file_async(filename):
    async with aiofiles.open(filename, mode='r') as file:
        content = await file.read()
        print(content)

async def write_file_async(filename, content):
    async with aiofiles.open(filename, mode='w') as file:
        await file.write(content)

async def main():
    await write_file_async('example.txt', 'Hello, Async World!')
    await read_file_async('example.txt')

# 运行异步任务
asyncio.run(main())

5. 文件编码与字符集

在处理文本文件时,编码是一个重要的问题。Python默认使用 UTF-8 编码,但你可以根据需要指定其他编码格式。常见的编码格式包括:

  • UTF-8:可变长度编码,兼容ASCII,广泛用于互联网和现代系统。
  • UTF-16:固定长度编码,适用于需要处理双字节字符的语言。
  • GBK:中文常用编码,主要用于简体中文环境。
  • ISO-8859-1:单字节编码,适用于西欧语言。
5.1 指定文件编码
python 复制代码
# 读取 UTF-8 编码的文件
with open('example_utf8.txt', 'r', encoding='utf-8') as file:
    content = file.read()
    print(content)

# 读取 GBK 编码的文件
with open('example_gbk.txt', 'r', encoding='gbk') as file:
    content = file.read()
    print(content)
5.2 处理编码错误

有时文件的编码可能不符合预期,导致读取时出现错误。可以使用 errors 参数来指定如何处理编码错误。常见的处理方式包括:

  • 'strict' :遇到错误时抛出 UnicodeDecodeError(默认行为)。
  • 'ignore':忽略无法解码的字符。
  • 'replace' :用替换字符(如 )代替无法解码的字符。
  • 'backslashreplace':用转义序列代替无法解码的字符。
  • 'surrogateescape':将无法解码的字符存储为代理字符,稍后可以恢复。
python 复制代码
# 忽略无法解码的字符
with open('example.txt', 'r', encoding='utf-8', errors='ignore') as file:
    content = file.read()
    print(content)

# 用替换字符代替无法解码的字符
with open('example.txt', 'r', encoding='utf-8', errors='replace') as file:
    content = file.read()
    print(content)

6. 文件权限与安全性

在处理文件时,确保文件的权限设置正确是非常重要的,尤其是在多用户系统或网络环境中。Python提供了 os 模块来管理文件权限。

6.1 设置文件权限

可以使用 os.chmod() 函数来修改文件的权限。权限使用八进制数表示,常见权限包括:

  • 0o777:所有用户都有读、写、执行权限。
  • 0o644:文件所有者有读写权限,其他用户只有读权限。
  • 0o755:文件所有者有读写执行权限,其他用户有读执行权限。
python 复制代码
import os

# 设置文件权限为 0o644
os.chmod('example.txt', 0o644)
6.2 获取文件权限

可以使用 os.stat() 函数获取文件的元数据,包括权限信息。

python 复制代码
import os
import stat

# 获取文件的元数据
stat_info = os.stat('example.txt')

# 打印文件权限
print(oct(stat_info.st_mode & 0o777))  # 输出权限的八进制表示
6.3 检查文件权限

可以使用 os.access() 函数检查文件的访问权限。

python 复制代码
import os

# 检查文件是否可读
if os.access('example.txt', os.R_OK):
    print("文件可读")

# 检查文件是否可写
if os.access('example.txt', os.W_OK):
    print("文件可写")

# 检查文件是否可执行
if os.access('example.txt', os.X_OK):
    print("文件可执行")

7. 文件系统监控

有时你可能需要监控文件系统的更改,例如文件的创建、修改或删除。Python提供了 watchdog 库来实现文件系统事件的监控。

7.1 安装 watchdog
bash 复制代码
pip install watchdog
7.2 监控文件系统事件
python 复制代码
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

class MyHandler(FileSystemEventHandler):
    def on_modified(self, event):
        print(f"文件 {event.src_path} 已被修改")

    def on_created(self, event):
        print(f"文件 {event.src_path} 已被创建")

    def on_deleted(self, event):
        print(f"文件 {event.src_path} 已被删除")

if __name__ == "__main__":
    event_handler = MyHandler()
    observer = Observer()
    observer.schedule(event_handler, path='.', recursive=True)
    observer.start()

    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()

    observer.join()

总结

Python的文件I/O功能不仅强大而且灵活,能够满足从简单的文件读写到复杂的文件系统操作的各种需求。通过深入了解文件对象的底层机制、缓冲区、文件锁定、异步I/O、编码处理、权限管理和文件系统监控等高级主题,您可以编写出更加高效、安全和可靠的文件操作代码。

如果您有更多具体的问题或需要进一步的解释,请随时告诉我!

相关推荐
域智盾-运营小韩1 分钟前
CAD图纸加密软件哪个最好用 | 安全可靠的解决方案
运维·网络
confident320 分钟前
spark-sql 备忘录
服务器·sql·spark
宁君22 分钟前
Elasticsearch高性能优化2
linux·运维·服务器
sdkdlwk44 分钟前
ubuntu上更改ext4格式的硬盘为 windows的 NTFS 格式参考
linux·运维·ubuntu
苹果醋31 小时前
从零开始,一步一步搭建Typescript+React+Redux项目——集成react-router和axios(三)
运维·vue.js·spring boot·nginx·课程设计
休息一下接着来1 小时前
Ubuntu 挂载目录
linux·运维·ubuntu
良许Linux1 小时前
4G模块详解
linux·服务器·后端·互联网
rock——you2 小时前
docker容器报错No log line matching the ‘‘ filter
运维·docker·容器
vvw&2 小时前
如何在 Ubuntu 22.04 上使用 vnStat 监控网络流量
linux·运维·服务器·ubuntu·https·集群·vnstat
CQU_JIAKE2 小时前
12.4【计算机网络】【Study】
运维·服务器·计算机网络