24、Python标准库模块:输入输出相关功能详解

Python标准库模块:输入输出相关功能详解

在Python编程中,标准库提供了丰富的模块来处理各种输入输出任务。下面将详细介绍一些常用的标准库模块及其功能。

1. configparser模块

INI文件是一种常见的以人类可读形式编码程序配置信息的格式。例如:

# config.ini
; A comment
[section1]
name1 = value1
name2 = value2
[section2]
; Alternative syntax
name1: value1
name2: value2

configparser 模块用于读取 .ini 文件并提取值。以下是一个基本示例:

import configparser
# Create a config parser and read a file
cfg = configparser.ConfigParser()
cfg.read('config.ini')
# Extract values
a = cfg.get('section1', 'name1')
b = cfg.get('section2', 'name2')

该模块还提供了更高级的功能,如字符串插值、合并多个 .ini 文件、提供默认值等,更多示例可查阅官方文档。

2. csv模块

csv 模块用于读写由Microsoft Excel等程序生成或从数据库导出的逗号分隔值(CSV)文件。使用时,先打开文件,再对其进行CSV编码/解码。
- 读取CSV文件到元组列表

import csv
# Read a CSV file into a list of tuples
def read_csv_data(filename):
    with open(filename, newline='') as file:
        rows = csv.reader(file)
        # First line is often a header. This reads it
        headers = next(rows)
        # Now read the rest of the data
        for row in rows:
            # Do something with row
            ...
  • 将Python数据写入CSV文件
def write_csv_data(filename, headers, rows):
    with open(filename, 'w', newline='') as file:
        out = csv.writer(file)
        out.writerow(headers)
        out.writerows(rows)

也可以使用 DictReader() ,它将CSV文件的第一行解释为标题,并将每行作为字典返回。

import csv
def find_nearby(filename):
    with open(filename, newline='') as file:
        rows = csv.DictReader(file)
        for row in rows:
            lat = float(rows['latitude'])
            lon = float(rows['longitude'])
            if close_enough(lat, lon):
                print(row)

csv 模块主要用于读写CSV数据,其优势在于能正确编码/解码数据,并处理引号、特殊字符等边缘情况。若要进行CSV数据分析,可考虑使用第三方库,如 pandas

3. errno模块

当发生系统级错误时,Python会抛出 OSError 的子类异常。一些常见的系统错误有单独的子类表示,如 PermissionError FileNotFoundError ,但实际中还有数百种其他错误。任何 OSError 异常都带有一个数字 errno 属性,可通过 errno 模块提供的符号常量来检查。例如,检查设备是否没有剩余空间的异常处理程序:

import errno
def write_data(file, data):
    try:
        file.write(data)
    except OSError as e:
        if e.errno == errno.ENOSPC:
            print("You're out of disk space!")
        else:
            raise
    # Some other error. Propagate
4. fcntl模块

fcntl 模块用于在UNIX系统上使用 fcntl() ioctl() 系统调用执行低级I/O控制操作,也可用于文件锁定。以下是使用 fcntl.flock() 实现跨所有进程的互斥锁定打开文件的示例:

import fcntl
with open("somefile", "r") as file:
    try:
        fcntl.flock(file.fileno(), fcntl.LOCK_EX)
        # Use the file
        ...
    finally:
        fcntl.flock(file.fileno(), fcntl.LOCK_UN)
5. hashlib模块

hashlib 模块提供了计算加密哈希值的函数,如MD5和SHA - 1。示例如下:

import hashlib
h = hashlib.new('sha256')
h.update(b'Hello')
# Feed data
h.update(b'World')
print(h.digest())
print(h.hexdigest())
print(h.digest_size)
6. http包

http 包包含大量与HTTP互联网协议底层实现相关的代码,可用于实现服务器和客户端。但该包大部分内容被认为是遗留的,对于日常工作来说过于底层,处理HTTP的专业程序员更倾向于使用第三方库,如 requests httpx Django flask 等。不过,该包有一个实用功能,即Python可以运行独立的Web服务器。在包含文件的目录中,输入以下命令:

bash $ python -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

这可用于测试和调试与Web相关的程序。

7. io模块

io 模块主要包含用于实现 open() 函数返回的文件对象的类定义。通常不直接访问这些类,但该模块包含两个有用的类,可用于以字符串和字节形式“伪造”文件,这在测试等场景中很有用。
- StringIO类 :提供基于字符串的类文件接口。

# Function that expects a file
def greeting(file):
    file.write('Hello\n')
    file.write('World\n')
# Call the function using a real file
with open('out.txt', 'w') as file:
    greeting(file)
# Call the function with a "fake" file
import io
file = io.StringIO()
greeting(file)
# Get the resulting output
output = file.getvalue()

也可创建 StringIO 对象用于读取:

file = io.StringIO('hello\nworld\n')
while (line := file.readline()):
    print(line, end='')
  • BytesIO类 :用于模拟二进制I/O。
8. json模块

json 模块可用于编码和解码JSON格式的数据,JSON常用于微服务和Web应用的API。有两个基本函数用于数据转换:
- dumps() :将Python字典编码为JSON Unicode字符串。

import json
data = { 'name': 'Mary A. Python', 'email': 'mary123@python.org' }
s = json.dumps(data)
print(s)
  • loads() :将JSON字符串解码为Python字典。
d = json.loads(s)
print(d == data)

这两个函数有许多控制转换和与Python类实例交互的选项,更多信息可查阅官方文档。

9. logging模块

logging 模块是用于报告程序诊断信息和进行打印式调试的事实上的标准模块,可将输出路由到日志文件,并提供大量配置选项。常见做法是创建 Logger 实例并使用其方法记录消息。

import logging
log = logging.getLogger(__name__)
# Function that uses logging
def func(args):
    log.debug("A debugging message")
    log.info("An informational message")
    log.warning("A warning message")
    log.error("An error message")
    log.critical("A critical message")
# Configuration of logging (occurs one at program startup)
if __name__ == '__main__':
    logging.basicConfig(
        level=logging.WARNING,
        filename="output.log"
    )

日志有五个内置级别,配置日志系统时可指定一个级别作为过滤器,只有该级别或更高级别的消息才会被报告。

以下是这些模块的功能总结表格:
| 模块 | 功能 |
| ---- | ---- |
| configparser | 读取和处理INI配置文件 |
| csv | 读写CSV文件 |
| errno | 处理系统级错误的错误码 |
| fcntl | 执行UNIX系统的低级I/O控制和文件锁定 |
| hashlib | 计算加密哈希值 |
| http | 实现HTTP协议的服务器和客户端 |
| io | 模拟文件对象 |
| json | 编码和解码JSON数据 |
| logging | 记录程序日志 |

下面是使用 configparser csv 模块的简单流程图:

graph TD;
    A[开始] --> B[使用configparser读取INI文件];
    B --> C[使用csv读取CSV文件];
    C --> D[处理数据];
    D --> E[使用csv写入CSV文件];
    E --> F[结束];
10. os模块

os 模块提供了与常见操作系统函数的可移植接口,这些函数通常与进程环境、文件、目录、权限等相关。其编程接口紧密遵循C编程和POSIX等标准。不过,在典型应用中,该模块的大部分功能可能过于底层。但当遇到执行一些晦涩的低级系统操作(如打开TTY)时,可能会用到该模块的功能。

11. os.path模块

os.path 模块是用于操作路径名和在文件系统上执行常见操作的传统模块。其功能在很大程度上已被较新的 pathlib 模块取代,但由于其使用仍然非常广泛,在很多代码中仍能看到它。该模块解决的一个基本问题是在UNIX(正斜杠 / )和Windows(反斜杠 \ )上对路径分隔符进行可移植处理。常用函数如 os.path.join() os.path.split() 用于拆分和组合文件路径。

import os.path
filename = '/Users/beazley/Desktop/old/data.csv'
print(os.path.split(filename))
print(os.path.join('/Users/beazley/Desktop', 'out.txt'))

以下是使用这些函数的示例代码:

import os.path
def clean_line(line):
    # Line up a line (whatever)
    return line.strip().upper() + '\n'
def clean_data(filename):
    dirname, basename = os.path.split(filename)
    newname = os.path.join(dirname, basename+'.clean')
    with open(newname, 'w') as out_f:
        with open(filename, 'r') as in_f:
            for line in in_f:
                out_f.write(clean_line(line))

os.path 模块还有一些用于对文件系统进行测试和获取文件元数据的函数,如 isfile() isdir() getsize() 。例如,计算文件或目录总大小的函数:

import os.path
def compute_usage(filename):
    if os.path.isfile(filename):
        return os.path.getsize(filename)
    elif os.path.isdir(filename):
        return sum(compute_usage(os.path.join(filename, name)) for name in os.listdir(filename))
    else:
        raise RuntimeError('Unsupported file kind')
12. pathlib模块

pathlib 模块是一种以可移植和高级方式操作路径名的现代方法。它将许多面向文件的功能集中在一处,并使用面向对象的接口。核心对象是 Path 类。

from pathlib import Path
filename = Path('/Users/beazley/old/data.csv')
print(filename.name)
print(filename.parent)
print(filename.parent / 'newfile.csv')
print(filename.parts)
print(filename.with_suffix('.csv.clean'))

使用 Path 实例也可以重新实现前面的 compute_usage() 函数:

import pathlib
def compute_usage(filename):
    pathname = pathlib.Path(filename)
    if pathname.is_file():
        return pathname.stat().st_size
    elif pathname.is_dir():
        return sum(path.stat().st_size for path in pathname.rglob('*') if path.is_file())
    else:
        raise RuntimeError('Unsupported file kind')
13. re模块

re 模块用于使用正则表达式执行文本匹配、搜索和替换操作。示例如下:

import re
text = 'Today is 3/27/2018. Tomorrow is 3/28/2018.'
# Find all occurrences of a date
print(re.findall(r'\d+/\d+/\d+', text))
# Replace all occurrences of a date with replacement text
print(re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', text))

正则表达式的语法通常比较难懂,在上述示例中, \d+ 表示“一个或多个数字”。更多关于模式语法的信息可查阅 re 模块的官方文档。

14. shutil模块

shutil 模块用于执行一些通常在shell中进行的常见任务,包括复制和删除文件、处理存档等。
- 复制文件

import shutil
shutil.copy(srcfile, dstfile)
  • 移动文件
shutil.move(srcfile, dstfile)
  • 复制目录树
shutil.copytree(srcdir, dstdir)
  • 删除目录树
shutil.rmtree(pathname)

shutil 模块通常作为使用 os.system() 函数直接执行shell命令的更安全、更可移植的替代方案。

15. select模块

select 模块用于对多个I/O流进行简单轮询,即可以监视一组文件描述符,查看是否有传入数据或是否可以发送传出数据。示例如下:

import select
# Collections of objects representing file descriptors. Must be integers or objects with a fileno() method.
want_to_read = [ ... ]
want_to_write = [ ... ]
check_exceptions = [ ... ]
# Timeout (or None)
timeout = None
# Poll for I/O
can_read, can_write, have_exceptions = select.select(want_to_read, want_to_write, check_exceptions, timeout)
# Perform I/O operations
for file in can_read:
    do_read(file)
for file in can_write:
    do_write(file)
# Handle exceptions
for file in have_exceptions:
    handle_exception(file)

在这段代码中,构造了三组文件描述符,分别对应读取、写入和异常。这些组与一个可选的超时时间一起传递给 select() 函数。 select() 返回传入参数的三个子集,这些子集表示可以执行请求操作的文件。例如, can_read 中返回的文件有传入数据待处理。 select() 函数是一个标准的低级系统调用,常用于监视系统事件和实现异步I/O框架,如内置的 asyncio 模块。除了 select() select 模块还提供了 poll() epoll() kqueue() 等类似功能的函数,这些函数的可用性因操作系统而异。 selectors 模块提供了更高级的 select 接口,在某些情况下可能会有用。

16. smtplib模块

smtplib 模块实现了SMTP的客户端,常用于发送电子邮件。以下是一个示例:

import smtplib
fromaddr = "someone@some.com"
toaddrs = ["recipient@other.com" ]
amount = 123.45
msg = f"""From: {fromaddr}
Pay {amount} bitcoin or else.
We're watching.
"""
server = smtplib.SMTP('localhost')
server.sendmail(fromaddr, toaddrs, msg)
server.quit()

该模块还有处理密码、身份验证等的附加功能。如果在配置为支持电子邮件的机器上运行脚本,上述示例通常可以完成任务。

17. socket模块

socket 模块提供了对网络编程函数的低级访问,其接口仿照了与C语言系统编程相关的标准BSD套接字接口。
- 建立连接并接收响应

from socket import socket, AF_INET, SOCK_STREAM
sock = socket(AF_INET, SOCK_STREAM)
sock.connect(('python.org', 80))
sock.send(b'GET /index.html HTTP/1.0\r\n\r\n')
parts = []
while True:
    part = sock.recv(10000)
    if not part:
        break
    parts.append(part)
parts = b''.join(parts)
print(parts)
  • 基本的回声服务器
from socket import socket, AF_INET, SOCK_STREAM
def echo_server(address):
    sock = socket(AF_INET, SOCK_STREAM)
    sock.bind(address)
    sock.listen(1)
    while True:
        client, addr = sock.accept()
        echo_handler(client, addr)
def echo_handler(client, addr):
    print('Connection from:', addr)
    with client:
        while True:
            data = client.recv(10000)
            if not data:
                break
            client.sendall(data)
    print('Connection closed')
if __name__ == '__main__':
    echo_server(('', 25000))
  • UDP服务器和客户端示例
# udp.py
from socket import socket, AF_INET, SOCK_DGRAM
def run_server(address):
    sock = socket(AF_INET, SOCK_DGRAM)
    # 1. Create a UDP socket
    sock.bind(address)
    # 2. Bind to address/port
    while True:
        msg, addr = sock.recvfrom(2000)
        # 3. Get a message
        # ... do something
        response = b'world'
        sock.sendto(response, addr)
        # 4. Send a response back
def run_client(address):
    sock = socket(AF_INET, SOCK_DGRAM)
    # 1. Create a UDP socket
    sock.sendto(b'hello', address)
    # 2. Send a message
    response, addr = sock.recvfrom(2000)
    # 3. Get response
    print("Received:", response)
    sock.close()
if __name__ == '__main__':
    import sys
    if len(sys.argv) != 4:
        raise SystemExit('Usage: udp.py [-client|-server] hostname port')
    address = (sys.argv[2], int(sys.argv[3]))
    if sys.argv[1] == '-server':
        run_server(address)
    elif sys.argv[1] == '-client':
        run_client(address)

以下是后面这些模块的功能总结表格:
| 模块 | 功能 |
| ---- | ---- |
| os | 提供与操作系统函数的可移植接口 |
| os.path | 操作路径名和执行文件系统常见操作 |
| pathlib | 以可移植和高级方式操作路径名 |
| re | 使用正则表达式进行文本处理 |
| shutil | 执行文件和目录的复制、移动、删除等操作 |
| select | 对多个I/O流进行简单轮询 |
| smtplib | 实现SMTP客户端发送电子邮件 |
| socket | 提供网络编程的低级访问 |

下面是使用 re shutil 模块的简单流程图:

graph TD;
    A[开始] --> B[使用re进行文本搜索和替换];
    B --> C[使用shutil复制文件];
    C --> D[处理复制后的文件];
    D --> E[使用shutil删除临时文件];
    E --> F[结束];

综上所述,Python标准库中的这些模块为开发者提供了丰富的功能,涵盖了文件处理、网络编程、错误处理、日志记录等多个方面。合理使用这些模块可以提高开发效率,减少重复劳动。在实际开发中,应根据具体需求选择合适的模块和方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值