Python输入和输出详解
1. 概述
在Python编程中,输入(Input)是指程序从外部获取数据的过程,输出(Output)是指程序向外部发送数据的过程。Python提供了丰富的输入输出功能,包括:
- 标准输入输出(键盘输入、屏幕输出)
- 文件输入输出
- 网络输入输出
- 格式化输出
- 各种数据格式的输入输出(JSON、CSV、XML等)
2. 标准输出
标准输出(Standard Output)是指将数据输出到屏幕上,Python主要使用print()函数来实现。
2.1 print()函数的基本用法
# 输出字符串
print("Hello, World!")
# 输出数字
print(42)
# 输出变量
name = "Zhang San"
print(name)
# 输出表达式结果
print(2 + 3)
2.2 print()函数的参数
print()函数支持多个参数,可以同时输出多个值:
# 输出多个值,默认用空格分隔
print("Name:", "Zhang San", "Age:", 30)
# 自定义分隔符
print("apple", "banana", "orange", sep=", ") # 输出: apple, banana, orange
# 自定义结束符(默认是换行符)
print("Hello", end=" ")
print("World!") # 输出: Hello World!
# 输出到文件
with open("output.txt", "w") as f:
print("Hello, File!", file=f)
2.3 print()函数的高级用法
# 输出包含特殊字符的字符串
print("Line 1\nLine 2\nLine 3") # 多行输出
print("\tIndented line") # 缩进
print("Backslash: \") # 输出反斜杠
# 输出对象
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"Person(name={self.name}, age={self.age})"
person = Person("Li Si", 25)
print(person) # 输出: Person(name=Li Si, age=25)
3. 格式化输出
格式化输出是指将数据按照指定的格式输出,Python提供了多种格式化字符串的方法。
3.1 字符串拼接
最基本的格式化方法:
name = "Wang Wu"
age = 28
print("My name is " + name + ", I'm " + str(age) + " years old.")
3.2 %格式化操作符
类似于C语言的printf()函数:
# 整数
print("%d" % 42) # 输出: 42
# 浮点数
print("%f" % 3.14159) # 输出: 3.141590
print("%.2f" % 3.14159) # 输出: 3.14
# 字符串
print("%s" % "Hello") # 输出: Hello
# 多个值
name = "Zhao Liu"
age = 32
print("My name is %s, I'm %d years old." % (name, age))
# 混合格式
pi = 3.14159
print("Pi: %10.3f" % pi) # 输出: Pi: 3.142
3.3 str.format()方法
Python 2.6+引入的格式化方法:
# 位置参数
print("{} + {} = {}".format(2, 3, 5)) # 输出: 2 + 3 = 5
# 命名参数
print("Name: {name}, Age: {age}".format(name="Qian Qi", age=27))
# 访问列表元素
fruits = ["apple", "banana", "orange"]
print("First fruit: {0[0]}, Second fruit: {0[1]}".format(fruits))
# 访问字典元素
person = {"name": "Sun Ba", "age": 35}
print("Name: {name}, Age: {age}".format(**person))
# 格式化数字
print("Pi: {:.2f}".format(3.14159)) # 输出: Pi: 3.14
print("Number: {:05d}".format(42)) # 输出: Number: 00042
print("Percent: {:.2%}".format(0.75)) # 输出: Percent: 75.00%
3.4 f-strings (格式化字符串字面量)
Python 3.6+引入的最现代的格式化方法:
# 基本用法
name = "Zhou Jiu"
age = 29
print(f"My name is {name}, I'm {age} years old.")
# 表达式
x = 10
y = 20
print(f"{x} + {y} = {x + y}") # 输出: 10 + 20 = 30
# 函数调用
print(f"Uppercase: {name.upper()}") # 输出: Uppercase: ZHOU JIU
# 格式化数字
pi = 3.14159
print(f"Pi: {pi:.2f}") # 输出: Pi: 3.14
print(f"Number: {42:05d}") # 输出: Number: 00042
print(f"Percent: {0.75:.2%}") # 输出: Percent: 75.00%
# 日期格式化
from datetime import datetime
now = datetime.now()
print(f"Current time: {now:%Y-%m-%d %H:%M:%S}")
3.5 三种格式化方法的比较
| 方法 | 语法 | 优点 | 缺点 |
|---|---|---|---|
%操作符 |
"%s %d" % (str, num) |
兼容性好 | 语法复杂,不支持新特性 |
str.format() |
"{} {}".format(str, num) |
功能强大,兼容性较好 | 语法相对冗长 |
| f-strings | f"{str} {num}" |
语法简洁,功能强大 | 仅支持Python 3.6+ |
推荐:优先使用f-strings(Python 3.6+),对于需要兼容旧版本的代码,使用str.format()。
3. 标准输入
标准输入(Standard Input)是指从键盘获取用户输入,Python主要使用input()函数来实现。
3.1 input()函数的基本用法
# 获取字符串输入
name = input("请输入你的名字: ")
print(f"你好, {name}!")
# 获取数字输入(需要转换类型)
age = input("请输入你的年龄: ")
age = int(age) # 转换为整数
print(f"你{age}岁了")
height = input("请输入你的身高(米): ")
height = float(height) # 转换为浮点数
print(f"你的身高是{height}米")
3.2 input()函数的高级用法
# 获取多个输入(用空格分隔)
name, age = input("请输入你的名字和年龄(用空格分隔): ").split()
age = int(age)
print(f"你好, {name}, 你{age}岁了")
# 获取多个输入(用逗号分隔)
data = input("请输入三个数字(用逗号分隔): ").split(",")
# 转换为整数列表
numbers = [int(x.strip()) for x in data]
print(f"你输入的数字是: {numbers}")
# 密码输入(不回显)
import getpass
password = getpass.getpass("请输入密码: ")
print(f"你输入的密码是: {password}") # 实际应用中不会输出密码
3.3 处理异常输入
# 确保输入是整数
try:
age = int(input("请输入你的年龄: "))
print(f"你{age}岁了")
except ValueError:
print("请输入有效的整数!")
# 循环直到输入有效
while True:
try:
number = float(input("请输入一个数字: "))
break
except ValueError:
print("无效输入,请重新输入!")
print(f"你输入的数字是: {number}")
4. 文件输入输出
文件输入输出(File I/O)是指程序与文件系统之间的数据交换,Python提供了丰富的文件操作功能。
4.1 文件的打开与关闭
使用open()函数打开文件,使用close()方法关闭文件:
# 打开文件(文本模式)
file = open("example.txt", "r") # "r"表示只读模式
# 读取文件内容
content = file.read()
print(content)
# 关闭文件
file.close()
推荐:使用with语句自动关闭文件(上下文管理器):
with open("example.txt", "r") as file:
content = file.read()
print(content)
# 文件会自动关闭
4.2 文件打开模式
| 模式 | 描述 |
|---|---|
r |
只读模式(默认) |
w |
写入模式(覆盖原有内容) |
a |
追加模式(在文件末尾添加内容) |
x |
独占创建模式(如果文件已存在则报错) |
b |
二进制模式 |
t |
文本模式(默认) |
+ |
读写模式 |
组合模式示例:
# 二进制只读模式
with open("image.jpg", "rb") as f:
data = f.read()
# 文本读写模式
with open("example.txt", "r+") as f:
content = f.read()
f.write("新内容")
# 二进制写入模式
with open("data.bin", "wb") as f:
f.write(b"Hello")
4.3 文件读取方法
4.3.1 read()方法
读取整个文件内容:
with open("example.txt", "r") as f:
content = f.read() # 读取所有内容
print(content)
# 读取指定字节数
f.seek(0) # 回到文件开头
first_10_bytes = f.read(10) # 读取前10个字节
print(first_10_bytes)
4.3.2 readline()方法
逐行读取文件:
with open("example.txt", "r") as f:
line1 = f.readline() # 读取第一行
line2 = f.readline() # 读取第二行
print(line1, end="")
print(line2, end="")
4.3.3 readlines()方法
读取所有行到列表中:
with open("example.txt", "r") as f:
lines = f.readlines() # 返回包含所有行的列表
for line in lines:
print(line, end="")
4.3.4 直接迭代文件对象
最简洁的逐行读取方式:
with open("example.txt", "r") as f:
for line in f:
print(line, end="")
4.4 文件写入方法
4.4.1 write()方法
写入字符串或二进制数据:
# 写入文本
with open("output.txt", "w") as f:
f.write("Hello, World!\n")
f.write("Python is awesome!\n")
# 写入二进制数据
with open("binary.dat", "wb") as f:
f.write(b"\x48\x65\x6c\x6c\x6f") # "Hello"的ASCII码
4.4.2 writelines()方法
写入字符串列表:
lines = ["Line 1\n", "Line 2\n", "Line 3\n"]
with open("output.txt", "w") as f:
f.writelines(lines)
4.5 文件指针操作
with open("example.txt", "r+") as f:
# 获取当前指针位置
print(f.tell()) # 输出: 0
# 读取5个字符
print(f.read(5))
# 获取当前指针位置
print(f.tell()) # 输出: 5
# 移动指针到文件开头
f.seek(0)
# 移动指针到文件末尾
f.seek(0, 2) # 第二个参数2表示相对于文件末尾
# 从当前位置向后移动10个字节
f.seek(10, 1) # 第二个参数1表示相对于当前位置
5. 文件和目录操作
Python的os和os.path模块提供了文件和目录的操作功能。
5.1 文件操作
import os
import os.path
# 检查文件是否存在
if os.path.exists("example.txt"):
print("文件存在")
# 获取文件大小
size = os.path.getsize("example.txt")
print(f"文件大小: {size} 字节")
# 获取文件修改时间
mtime = os.path.getmtime("example.txt")
import datetime
print(f"文件修改时间: {datetime.datetime.fromtimestamp(mtime)}")
# 重命名文件
os.rename("old_name.txt", "new_name.txt")
# 删除文件
os.remove("example.txt")
5.2 目录操作
# 创建目录
os.mkdir("new_dir")
# 创建多级目录
os.makedirs("parent/child/grandchild", exist_ok=True)
# 列出目录内容
files = os.listdir(".")
print(f"当前目录内容: {files}")
# 获取当前工作目录
cwd = os.getcwd()
print(f"当前工作目录: {cwd}")
# 改变工作目录
os.chdir("new_dir")
# 删除目录(必须为空)
os.rmdir("empty_dir")
# 删除多级目录
import shutil
shutil.rmtree("parent")
6. 高级输入输出
6.1 JSON数据的输入输出
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,Python的json模块提供了JSON数据的处理功能。
import json
# Python对象转换为JSON字符串
person = {
"name": "Zhang San",
"age": 30,
"city": "Beijing",
"hobbies": ["reading", "swimming", "coding"]
}
# 序列化为JSON字符串
json_str = json.dumps(person)
print(json_str)
# 格式化输出JSON
json_str_pretty = json.dumps(person, indent=4, ensure_ascii=False)
print(json_str_pretty)
# 写入JSON文件
with open("person.json", "w", encoding="utf-8") as f:
json.dump(person, f, indent=4, ensure_ascii=False)
# 从JSON字符串解析为Python对象
json_str = '{"name": "Li Si", "age": 25}'
person = json.loads(json_str)
print(person["name"])
print(person["age"])
# 从JSON文件读取
with open("person.json", "r", encoding="utf-8") as f:
person = json.load(f)
print(person["name"])
print(person["hobbies"])
6.2 CSV数据的输入输出
CSV(Comma-Separated Values)是一种常见的表格数据格式,Python的csv模块提供了CSV数据的处理功能。
import csv
# 写入CSV文件
with open("students.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
# 写入表头
writer.writerow(["姓名", "年龄", "城市"])
# 写入数据行
writer.writerow(["Zhang San", 30, "Beijing"])
writer.writerow(["Li Si", 25, "Shanghai"])
writer.writerow(["Wang Wu", 28, "Guangzhou"])
# 读取CSV文件
with open("students.csv", "r", encoding="utf-8") as f:
reader = csv.reader(f)
for row in reader:
print(row)
# 使用DictWriter和DictReader
with open("students_dict.csv", "w", newline="", encoding="utf-8") as f:
fieldnames = ["姓名", "年龄", "城市"]
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({"姓名": "Zhang San", "年龄": 30, "城市": "Beijing"})
writer.writerow({"姓名": "Li Si", "年龄": 25, "城市": "Shanghai"})
with open("students_dict.csv", "r", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
print(row["姓名"], row["年龄"], row["城市"])
6.3 二进制文件的输入输出
# 读取二进制文件
with open("image.jpg", "rb") as f:
data = f.read()
print(f"读取了 {len(data)} 字节")
# 写入二进制文件
with open("copy_image.jpg", "wb") as f:
f.write(data)
print("二进制文件复制完成")
# 读取二进制文件的特定部分
with open("image.jpg", "rb") as f:
# 读取文件头
header = f.read(100)
print(f"文件头: {header}")
6.4 压缩文件的输入输出
Python的zipfile模块提供了ZIP压缩文件的处理功能:
import zipfile
# 创建ZIP文件
with zipfile.ZipFile("archive.zip", "w") as zf:
zf.write("example.txt")
zf.write("students.csv")
print("ZIP文件创建完成")
# 读取ZIP文件内容
with zipfile.ZipFile("archive.zip", "r") as zf:
# 列出ZIP文件中的内容
print("ZIP文件内容:", zf.namelist())
# 读取ZIP文件中的文件
with zf.open("example.txt") as f:
content = f.read().decode("utf-8")
print("example.txt内容:", content)
# 解压ZIP文件
zf.extractall("extracted")
print("ZIP文件解压完成")
7. 网络输入输出
Python的urllib和requests模块提供了网络输入输出功能。
7.1 使用urllib模块
from urllib import request
# 发送HTTP GET请求
url = "https://www.example.com"
response = request.urlopen(url)
# 读取响应内容
content = response.read().decode("utf-8")
print(f"响应状态码: {response.status}")
print(f"响应内容长度: {len(content)} 字符")
# 下载文件
file_url = "https://www.example.com/image.jpg"
request.urlretrieve(file_url, "downloaded_image.jpg")
print("文件下载完成")
7.2 使用requests模块(第三方库)
# 需要先安装: pip install requests
import requests
# 发送HTTP GET请求
response = requests.get("https://www.example.com")
print(f"响应状态码: {response.status_code}")
print(f"响应内容: {response.text}")
# 发送带参数的请求
params = {"q": "Python", "page": 1}
response = requests.get("https://www.example.com/search", params=params)
# 发送POST请求
data = {"username": "user", "password": "pass"}
response = requests.post("https://www.example.com/login", data=data)
# 下载文件
response = requests.get("https://www.example.com/image.jpg")
with open("image.jpg", "wb") as f:
f.write(response.content)
print("文件下载完成")
8. 输入输出的最佳实践
8.1 文件操作的最佳实践
- 始终使用
with语句:自动管理文件的打开和关闭,避免资源泄漏 - 指定字符编码:在处理文本文件时,始终指定字符编码(如
encoding="utf-8") - 错误处理:使用
try-except处理可能的IO错误 - 使用相对路径:避免使用硬编码的绝对路径
- 文件权限:确保程序有适当的文件访问权限
- 资源清理:在处理大文件时,及时释放资源
# 良好的文件操作示例
try:
with open("data.txt", "r", encoding="utf-8") as f:
content = f.read()
# 处理文件内容
except FileNotFoundError:
print("文件不存在")
except PermissionError:
print("没有文件访问权限")
except UnicodeDecodeError:
print("文件编码错误")
except Exception as e:
print(f"发生错误: {e}")
8.2 输入验证的最佳实践
- 始终验证用户输入:确保输入数据的类型和格式正确
- 使用异常处理:捕获和处理无效输入
- 提供清晰的错误信息:帮助用户纠正输入
- 限制输入长度:防止输入过大导致的问题
- 使用正则表达式:验证复杂的输入格式
# 良好的输入验证示例
import re
def get_email():
while True:
email = input("请输入你的邮箱: ").strip()
# 使用正则表达式验证邮箱格式
if re.match(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", email):
return email
else:
print("邮箱格式不正确,请重新输入")
email = get_email()
print(f"你的邮箱是: {email}")
8.3 输出格式化的最佳实践
- 使用f-strings:Python 3.6+推荐使用
- 保持输出简洁:避免过于复杂的输出格式
- 使用一致的格式:在整个项目中保持一致的输出格式
- 考虑国际化:如果需要支持多语言,使用适当的国际化库
- 使用日志代替print:在生产环境中,使用logging模块代替print语句
# 良好的输出示例
import logging
# 配置日志
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
# 使用日志代替print
logging.info("程序启动")
name = "Zhang San"
age = 30
logging.info(f"用户信息: 姓名={name}, 年龄={age}")
logging.info("程序结束")
9. 常见问题与解决方案
9.1 文件编码问题
问题:读取文件时出现UnicodeDecodeError
解决方案:指定正确的字符编码
# 尝试不同的编码
encodings = ["utf-8", "gbk", "gb2312", "latin-1"]
for encoding in encodings:
try:
with open("file.txt", "r", encoding=encoding) as f:
content = f.read()
print(f"使用{encoding}编码成功读取文件")
break
except UnicodeDecodeError:
print(f"使用{encoding}编码读取失败")
continue
9.2 大文件处理问题
问题:读取大文件时内存不足
解决方案:逐行读取或分块读取
# 逐行读取大文件
with open("large_file.txt", "r") as f:
for line in f:
# 处理每一行
process_line(line)
# 分块读取大文件
chunk_size = 1024 * 1024 # 1MB
with open("large_file.txt", "r") as f:
while True:
chunk = f.read(chunk_size)
if not chunk:
break
# 处理每一块
process_chunk(chunk)
9.3 路径问题
问题:文件路径不正确导致文件找不到
解决方案:使用绝对路径或正确的相对路径
import os
# 使用绝对路径
absolute_path = os.path.abspath("example.txt")
print(f"绝对路径: {absolute_path}")
# 构建正确的相对路径
current_dir = os.getcwd()
file_path = os.path.join(current_dir, "subdir", "example.txt")
print(f"构建的路径: {file_path}")
# 检查路径是否存在
if os.path.exists(file_path):
print("路径存在")
else:
print("路径不存在")
9.4 权限问题
问题:文件访问权限不足
解决方案:检查文件权限,确保程序有适当的访问权限
import os
# 检查文件权限
file_path = "example.txt"
# 检查读权限
if os.access(file_path, os.R_OK):
print("有读权限")
else:
print("没有读权限")
# 检查写权限
if os.access(file_path, os.W_OK):
print("有写权限")
else:
print("没有写权限")
10. 总结
Python提供了丰富的输入输出功能,从基本的标准输入输出到复杂的文件操作、网络通信和数据格式处理。通过学习和掌握这些功能,可以有效地处理各种输入输出需求,提高程序的交互性和实用性。
要点回顾:
- 标准输入输出:使用
print()函数输出,input()函数获取输入 - 格式化输出:推荐使用f-strings(Python 3.6+),或
str.format() - 文件操作:使用
with语句管理文件,open()函数打开文件 - 数据格式:掌握JSON、CSV、二进制文件等常用数据格式的处理
- 最佳实践:注意错误处理、资源管理和输入验证
- 性能考虑:对于大文件,使用逐行读取或分块读取
通过合理使用Python的输入输出功能,可以编写更加灵活、高效和用户友好的程序。
发布网站:荣殿教程(zhangrongdian.com) 作者:张荣殿 发布日期:2026-01-19