从用户读取输入 和 从文件读取内容。

从用户读取输入
当你说“不用 readline”,通常是指不使用 readline 模块来增强 input() 函数,Python 的 input() 函数本身已经提供了读取一行输入的功能,它不需要显式导入 readline 模块就能工作。
基本用法:input()
这是最直接、最常见的方式,它会提示用户输入,然后等待用户按下回车键,返回用户输入的整行内容(不包含换行符 \n)。
# prompt 是提示信息,可选
name = input("请输入你的名字: ")
age_str = input("请输入你的年龄: ")
print(f"你好, {name}!")
print(f"你输入的年龄是: {age_str}")
print(f"年龄的类型是: {type(age_str)}") # 注意:input() 总是返回字符串
# 如果需要数字,需要手动转换
age = int(age_str)
print(f"年龄加一后是: {age + 1}")
持续读取直到特定条件
如果你需要循环读取用户的输入,直到输入某个特定的值("quit")为止,可以使用 while 循环。
print("--- 持续输入模式,输入 'quit' 退出 ---")
user_inputs = []
while True:
line = input("请输入内容: ")
if line.lower() == 'quit':
break
user_inputs.append(line)
print("\n你输入的所有内容是:")
for item in user_inputs:
print(item)
直接读取原始输入(包含换行符)
input() 函数会自动去掉末尾的换行符,如果你需要获取包含换行符的原始输入,可以使用 sys.stdin。

import sys
print("请输入一行内容,然后按回车:")
# sys.stdin 是一个文件对象,调用其 read() 方法会读取一行
# 它会包含用户输入和末尾的换行符
raw_line = sys.stdin.readline()
print(f"你输入的原始内容是: {repr(raw_line)}") # repr() 可以更清楚地看到特殊字符
print(f"去掉换行符后是: {raw_line.strip()}")
# 也可以直接迭代 sys.stdin
print("\n现在开始逐行读取,按 Ctrl+D (Linux/macOS) 或 Ctrl+Z (Windows) 结束:")
for line in sys.stdin:
print(f"读取到: {line.strip()}")
注意:直接操作 sys.stdin 的行为与 input() 略有不同,尤其是在交互式环境中。
从文件读取内容
readline 模块在文件操作中主要用于逐行读取大文件以节省内存,即使不使用它,我们依然有多种高效的方法来读取文件。
方法1:使用 for 循环(最推荐、最 Pythonic 的方式)
这是读取文本文件最常用、最简洁的方法,Python 会自动处理文件的打开和关闭,并且内存效率很高,因为它是一次性读取一行到内存中。
file_path = 'my_text_file.txt'
try:
# with 语句会自动处理文件的关闭
with open(file_path, 'r', encoding='utf-8') as f:
for line in f:
# line 变量包含了每一行的内容,并且末尾有换行符 \n
# 使用 .strip() 可以去掉首尾的空白字符(包括换行符)
print(line.strip())
except FileNotFoundError:
print(f"错误:文件 {file_path} 未找到。")
方法2:使用 readlines() 方法
这个方法会一次性读取文件所有行到一个列表中,如果文件非常大,这会消耗大量内存,甚至导致程序崩溃,它只适用于小文件。

file_path = 'my_text_file.txt'
try:
with open(file_path, 'r', encoding='utf-8') as f:
# readlines() 返回一个列表,每个元素是一行(包含换行符)
all_lines = f.readlines()
print(f"文件共有 {len(all_lines)} 行。")
for i, line in enumerate(all_lines):
# 打印前5行
if i < 5:
print(f"第 {i+1} 行: {line.strip()}")
except FileNotFoundError:
print(f"错误:文件 {file_path} 未找到。")
方法3:使用 read() 方法
read() 方法会一次性读取整个文件内容到一个字符串中,这对于处理非文本文件(如图片、音频)或者需要处理整个文件内容作为单个字符串的场景很有用,和 readlines() 一样,它不适合大文件。
file_path = 'my_text_file.txt'
try:
with open(file_path, 'r', encoding='utf-8') as f:
# read() 读取整个文件内容到一个字符串
full_content = f.read()
# 打印前100个字符
print(f"文件内容(前100个字符): {full_content[:100]}...")
# 可以按换行符分割成行
lines = full_content.splitlines()
print(f"分割后有 {len(lines)} 行。")
except FileNotFoundError:
print(f"错误:文件 {file_path} 未找到。")
方法4:手动模拟 readline(不推荐,但为了说明原理)
如果你真的想不使用任何 readline 相关的功能(包括 for line in f),可以手动读取单个字符,直到遇到换行符,这种方法非常繁琐且效率低下,仅用于理解原理。
file_path = 'my_text_file.txt'
try:
with open(file_path, 'r', encoding='utf-8') as f:
while True:
line = []
while True:
char = f.read(1) # 每次只读取一个字符
if not char: # 如果到达文件末尾,read(1) 返回空字符串
break
if char == '\n':
break
line.append(char)
if not line: # line 是空列表,说明已经读到了文件末尾
break
# 将字符列表合并成字符串并打印
print(''.join(line))
except FileNotFoundError:
print(f"错误:文件 {file_path} 未找到。")
| 需求 | 推荐方法 | 说明 |
|---|---|---|
| 从用户读取一行 | input(prompt) |
标准方法,返回不带换行符的字符串。 |
| 从用户循环读取 | while True: + input() |
简单直接,易于实现交互式程序。 |
| 从文件逐行读取(大/小文件) | with open(...) as f: + for line in f: |
最推荐的 Pythonic 方式,高效且安全。 |
| 从文件读取所有行(小文件) | with open(...) as f: + f.readlines() |
返回一个列表,方便索引,但内存消耗大。 |
| 从文件读取全部内容(小文件/二进制) | with open(...) as f: + f.read() |
返回一个字符串,适用于整个文件作为整体处理。 |
核心结论:
在日常编程中,你几乎不需要显式地导入和使用 readline 模块,Python 的 input() 函数和 for line in file 的文件读取模式已经为绝大多数场景提供了简洁、高效且安全的解决方案。readline 模块主要是在构建复杂的命令行工具时,用于提供类似 Bash 的增强编辑体验。
