Python3 输入和输出详解

在 Python 编程中,输入(Input)和输出(Output)是与用户交互和数据处理的基础操作。本文将深入解析 Python3 中各种输入输出方式的使用方法、底层原理及最佳实践,帮助开发者构建高效、友好的程序交互界面。

一、标准输入输出(控制台交互)

1. 标准输出:print() 函数

print() 是 Python 最基本的输出函数,用于将对象转换为字符串并打印到标准输出(通常是控制台)。

常用参数:

  • sep:分隔多个对象的字符串(默认空格)
  • end:结尾字符串(默认换行符 \n
  • file:输出目标(默认 sys.stdout
  • flush:是否强制刷新缓冲区(默认 False

示例:
 
# 基本用法
print("Hello", "World", sep=", ", end="!\n")  # 输出:Hello, World!

# 格式化输出
name = "Alice"
age = 30
print(f"Name: {name}, Age: {age}")  # 输出:Name: Alice, Age: 30

# 输出到文件
with open("output.txt", "w") as f:
    print("This is a test", file=f)
 

2. 标准输入:input() 函数

input() 用于从标准输入读取用户输入的一行文本(以换行符结束),返回字符串类型。

示例:

# 基本用法
name = input("请输入您的姓名: ")
print(f"欢迎, {name}!")

# 转换输入类型
age = int(input("请输入您的年龄: "))  # 注意手动类型转换
print(f"您的年龄是: {age}")
 

二、格式化输出方法

1. 旧式格式化(% 操作符)

基于 C 语言的 printf 风格,使用 % 作为占位符:
 
name = "Bob"
age = 25
print("姓名: %s, 年龄: %d" % (name, age))  # 输出:姓名: Bob, 年龄: 25
 

2. 字符串方法 format()

Python 2.6+ 引入的格式化方法,使用 {} 作为占位符:
 
 
# 位置参数
print("姓名: {}, 年龄: {}".format("Charlie", 35))  # 输出:姓名: Charlie, 年龄: 35

# 关键字参数
print("姓名: {name}, 年龄: {age}".format(name="David", age=40))

# 访问对象属性
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

p = Person("Eve", 28)
print("姓名: {p.name}, 年龄: {p.age}".format(p=p))
 

3. f - 字符串(Python 3.6+)

最现代的格式化方法,在字符串前加 f,直接嵌入表达式:
 
 
name = "Frank"
age = 32
print(f"姓名: {name.upper()}, 年龄: {age + 2}")  # 输出:姓名: FRANK, 年龄: 34

# 格式化数字
pi = 3.1415926
print(f"Pi: {pi:.2f}")  # 输出:Pi: 3.14
 

三、文件输入输出

1. 文件操作基础

使用 open() 函数打开文件,返回文件对象,支持多种模式:

  • r:读取(默认)
  • w:写入(覆盖现有内容)
  • a:追加
  • b:二进制模式
  • +:读写模式

示例:

# 写入文件
with open("data.txt", "w") as f:
    f.write("Hello, World!\n")
    f.writelines(["Line 1\n", "Line 2\n"])  # 写入多行

# 读取文件
with open("data.txt", "r") as f:
    content = f.read()  # 读取全部内容
    print(content)

    # 逐行读取
    f.seek(0)  # 重置文件指针到开头
    for line in f:
        print(line.strip())  # 去除行尾换行符
 

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

自动管理文件的打开和关闭,避免资源泄漏:
# 推荐写法
with open("data.txt", "r") as f:
    data = f.read()

# 等效于手动管理
f = open("data.txt", "r")
try:
    data = f.read()
finally:
    f.close()  # 无论是否发生异常,都确保文件关闭
 

3. 二进制文件操作

使用 b 模式处理二进制数据(如图片、视频):

# 复制二进制文件
with open("source.jpg", "rb") as src, open("target.jpg", "wb") as dst:
    dst.write(src.read())
 

四、高级输入输出技术

1. 命令行参数解析(argparse 模块)

处理复杂的命令行参数,生成帮助信息:
 
 
import argparse

parser = argparse.ArgumentParser(description="计算两数之和")
parser.add_argument("num1", type=int, help="第一个数字")
parser.add_argument("num2", type=int, help="第二个数字")
parser.add_argument("-v", "--verbose", action="store_true", help="显示详细计算过程")

args = parser.parse_args()
result = args.num1 + args.num2

if args.verbose:
    print(f"{args.num1} + {args.num2} = {result}")
else:
    print(result)
 

执行示例:
python calculator.py 3 5         # 输出:8
python calculator.py 3 5 -v      # 输出:3 + 5 = 8
python calculator.py --help     # 显示帮助信息
 

2. 序列化与反序列化

将对象转换为可存储或传输的格式:

JSON 格式:
 
import json

# 序列化
data = {"name": "Grace", "age": 33, "hobbies": ["reading", "swimming"]}
with open("data.json", "w") as f:
    json.dump(data, f, indent=2)  # 写入JSON文件

# 反序列化
with open("data.json", "r") as f:
    loaded_data = json.load(f)
    print(loaded_data["name"])  # 输出:Grace
 

Pickle 格式(Python 专用):
 
 
import pickle

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

p = Person("Henry", 40)

# 序列化
with open("person.pkl", "wb") as f:
    pickle.dump(p, f)

# 反序列化
with open("person.pkl", "rb") as f:
    loaded_p = pickle.load(f)
    print(loaded_p.name)  # 输出:Henry
 

3. 标准流重定向

临时修改标准输入 / 输出:
 
import sys

# 重定向标准输出到文件
original_stdout = sys.stdout
with open("output.log", "w") as f:
    sys.stdout = f
    print("This will be written to the file")
    sys.stdout = original_stdout  # 恢复标准输出

print("This will be printed on the console")
 

五、错误处理与异常输入

1. 输入验证

确保用户输入符合预期格式:

while True:
    try:
        age = int(input("请输入您的年龄: "))
        if age < 0:
            raise ValueError("年龄不能为负数")
        break
    except ValueError as e:
        print(f"输入错误: {e},请重新输入")
 

2. 文件操作异常

处理文件不存在、权限不足等问题:
 
 
try:
    with open("nonexistent.txt", "r") as f:
        data = f.read()
except FileNotFoundError:
    print("文件不存在,请检查路径")
except PermissionError:
    print("没有权限访问该文件")
except Exception as e:
    print(f"发生未知错误: {e}")

六、最佳实践

  1. 优先使用 f - 字符串:代码更简洁,性能更优。
  2. 避免硬编码文件路径:使用os.pathpathlib处理跨平台路径。
  3. 及时关闭文件:始终使用with语句管理文件资源。
  4. 处理二进制数据:明确区分文本模式(r/w)和二进制模式(rb/wb)。
  5. 验证用户输入:防止非法输入导致程序崩溃。
  6. 使用标准库模块:如argparse处理命令行参数,json处理数据序列化。

通过掌握上述输入输出技术,开发者可以构建功能丰富、交互友好的 Python 程序,高效处理各种数据格式和用户需求。

posted on 2025-07-18 10:42  小陶coding  阅读(230)  评论(0)    收藏  举报