杰瑞科技汇

Python不用readline如何高效逐行读取?

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

Python不用readline如何高效逐行读取?-图1
(图片来源网络,侵删)

从用户读取输入

当你说“不用 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

Python不用readline如何高效逐行读取?-图2
(图片来源网络,侵删)
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() 方法

这个方法会一次性读取文件所有行到一个列表中,如果文件非常大,这会消耗大量内存,甚至导致程序崩溃,它只适用于小文件

Python不用readline如何高效逐行读取?-图3
(图片来源网络,侵删)
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 的增强编辑体验。

分享:
扫描分享到社交APP
上一篇
下一篇