Python从标准输入读取数据的方法

Python从标准输入读取数据的方法

技术背景

在Python编程中,经常需要从标准输入(stdin)读取数据,比如在编写命令行工具、处理脚本输入或参与代码高尔夫挑战时。Python提供了多种方式来实现从标准输入读取数据,不同的方法适用于不同的场景。

实现步骤

使用fileinput模块

1
2
3
4
import fileinput

for line in fileinput.input():
pass

fileinput会遍历命令行参数指定的文件中的所有行,如果没有提供参数,则从标准输入读取。注意,line会包含一个尾随的换行符,可使用line.rstrip()去除。

使用sys.stdin

1
2
3
4
import sys

for line in sys.stdin:
print(line)

sys.stdin是一个类似文件的对象,可以调用readreadlines函数来读取所有内容,或者将内容按换行符分割。

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

1
2
3
4
# Python 3
name = input("Enter your name: ")
# Python 2
# name = raw_input("Enter your name: ")

这两个函数用于提示用户输入,input()在Python 3中使用,raw_input()在Python 2中使用。

使用open(0)(Python 3)或io.open(0)(Python 2)

1
2
3
4
5
# Python 3
data = open(0).read()
# Python 2
# from io import open
# data = open(0).read()

在Python 3中,open函数接受文件描述符,0 是标准输入的描述符。

使用open('/dev/stdin')

1
data = open('/dev/stdin').read()

该方法在Python 2和3中都可用,但不适用于Windows系统。

核心代码

完整示例:使用sys.stdininput

1
2
3
4
5
6
7
8
9
10
11
12
# 使用sys.stdin
import sys

for line in sys.stdin:
sys.stdout.write(line)

# 使用input(Python 3)
try:
while True:
print(input())
except EOFError:
pass

处理命令行参数和标准输入

1
2
3
4
5
import sys
f = open(sys.argv[1]) if len(sys.argv) > 1 else sys.stdin
for line in f:
# Do your stuff
pass

使用argparse处理输入

1
2
3
4
5
6
7
8
9
10
import argparse
import sys

parser = argparse.ArgumentParser()
parser.add_argument('infile',
default=sys.stdin,
type=argparse.FileType('r'),
nargs='?')
args = parser.parse_args()
data = args.infile.read()

最佳实践

  • 对于简单的交互式输入:优先使用input()(Python 3)或raw_input()(Python 2)。
  • 对于处理大量数据或文件输入:使用sys.stdinfileinput模块。
  • 在代码高尔夫场景中:可考虑使用open(0)open('/dev/stdin')

常见问题

数据阻塞问题

使用for line in sys.stdin:时,如果没有数据传入,程序会一直阻塞。可以使用select模块来检查是否有数据:

1
2
3
4
5
6
7
8
import sys
import select

if select.select([sys.stdin], [], [], 0.0)[0]:
help_file_fragment = sys.stdin.read()
else:
print("No data passed to stdin", file=sys.stderr)
sys.exit(2)

Windows系统下的二进制数据读取问题

在Windows系统中,sys.stdin默认以文本模式打开,读取二进制数据时会损坏\r\n。可通过以下方式解决:

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从标准输入读取数据的方法
https://119291.xyz/posts/python-read-from-stdin-methods/
作者
ww
发布于
2025年5月26日
许可协议