Python中从标准输入(stdin)读取数据的方法

Python中从标准输入(stdin)读取数据的方法

技术背景

在Python编程中,有时需要从标准输入(stdin)读取数据。标准输入通常是指命令行的输入,这在很多场景下都非常有用,比如编写命令行工具、处理脚本输入等。以下将介绍几种常见的从标准输入读取数据的方法。

实现步骤

1. 使用fileinput模块

fileinput模块可以循环处理文件或标准输入中的行。如果没有提供命令行参数,它将默认从标准输入读取数据。

1
2
3
4
5
import fileinput

for line in fileinput.input():
# 处理每一行数据,这里可根据需求修改
print(line.rstrip())

line.rstrip()用于去除每行末尾的换行符。

2. 使用sys.stdin

sys.stdin是一个文件对象,可以使用read()readlines()等方法读取数据。

1
2
3
4
5
6
7
8
9
import sys

# 读取所有数据
data = sys.stdin.read()
print(data)

# 逐行读取
for line in sys.stdin:
print(line.rstrip())

3. 使用input()函数(Python 3)或raw_input()函数(Python 2)

这两个函数用于从标准输入读取一行数据。

1
2
3
4
5
6
7
# Python 3
name = input("请输入你的名字: ")
print("你输入的名字是: ", name)

# Python 2
# name = raw_input("请输入你的名字: ")
# print "你输入的名字是: ", name

4. 使用open(0)(Python 3)

在Python 3中,open函数可以接受文件描述符,0代表标准输入。

1
2
data = open(0).read()
print(data)

核心代码

完整示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import sys
import fileinput

# 使用 fileinput 模块
print("使用 fileinput 模块:")
for line in fileinput.input():
print(line.rstrip())

# 使用 sys.stdin 逐行读取
print("使用 sys.stdin 逐行读取:")
for line in sys.stdin:
print(line.rstrip())

# 使用 sys.stdin 读取所有数据
print("使用 sys.stdin 读取所有数据:")
data = sys.stdin.read()
print(data)

# 使用 input() 函数
print("使用 input() 函数:")
name = input("请输入你的名字: ")
print("你输入的名字是: ", name)

# 使用 open(0)
print("使用 open(0):")
data = open(0).read()
print(data)

最佳实践

  • 处理大文件:当处理大文件时,建议逐行读取数据,避免一次性将整个文件加载到内存中,如使用for line in sys.stdin:for line in fileinput.input():
  • 去除换行符:从标准输入读取的行通常包含换行符,使用rstrip()方法去除换行符。
  • 兼容性:考虑不同Python版本的兼容性,如input()在Python 2和Python 3中的使用差异。

常见问题

1. for line in sys.stdin:会等待EOF才开始处理数据吗?

在某些情况下,如Python 2中可能存在缓冲问题,会导致看起来像是等待EOF才开始处理数据。但实际上,for line in sys.stdin:不会等待EOF,只是可能会有缓冲延迟。可以使用for line in iter(sys.stdin.readline, ''):来解决Python 2的缓冲问题。

2. input()fileinput.input()有什么区别?

input()用于读取一行数据,而fileinput.input()可以循环处理文件或标准输入中的所有行。

3. 如何处理二进制数据?

在Windows上,sys.stdin默认以文本模式打开,读取二进制数据时会损坏\r\n。可以使用sys.stdin.buffer(Python 3)或在Python 2中手动设置为二进制模式。

1
2
3
4
5
6
7
8
9
10
11
12
13
import sys

PY3K = sys.version_info >= (3, 0)

if PY3K:
source = sys.stdin.buffer
else:
if sys.platform == "win32":
import os, msvcrt
msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
source = sys.stdin

b = source.read()

Python中从标准输入(stdin)读取数据的方法
https://119291.xyz/posts/2025-04-15.python-reading-from-stdin-methods/
作者
ww
发布于
2025年4月15日
许可协议