将所有的标准输入“一口气”读入字符串的最有效方法

21

我正在为Python 2.7编写一个电子邮件解析器,它将通过别名调用sendmail,使用email模块进行解析,然后处理并存储到Oracle数据库中:

来自/etc/aliases:

myalias: | /my/python/script.py

我遇到了一个问题,“吞入”所有标准输入(stdin)并将其转换成一个字符串对象,以便我可以与电子邮件模块一起使用:

import email

# Slurp stdin and store into message
message =

msg = email.message_from_string(message)

# Do something with it
print msg['Subject']

怎么才能最有效地做到这一点?我尝试过使用 stdin.readlines() 但它输出的是一个列表。

感谢任何帮助。(如果我显得很菜鸟请原谅...我曾经使用 Perl,现在被迫使用 Python 标准化我的工具,并且这是我的第二个脚本。其实并不是真正的“被迫”,我早就想这样做了,只是没有像现在这样在期限的压力下)

1个回答

29

sys.stdin.readlines() 返回一个包含多行内容的列表。如果你想要得到一个长字符串(包含多行内容),可以使用 sys.stdin.read()


3
如果你想要大口喝而不是小口喝,那么请继续读取标准输入(stdin)直到它返回0字节,否则在处理较大的信息时会出现问题。 - tdelaney
1
@tdelaney 为什么会这样?你有我可以阅读的来源吗?我刚刚用 cat ~/bash_history | test.py 测试了一下,这是一个很大的文件,第二个 sys.stdin.read 的长度总是为0。这是在 Python 版本 3.7.3 中测试的。 - Wis
2
Python不是C语言。pydoc sys.stdin.read说:“如果省略或者size参数为负数,那么会一直读取直到EOF(文件结束符)被读取。” - Sam Watkins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接