Python中关于sys.stdout.write的问题请教
请问如下代码为何不会输出 a、b、c,比如对于传入的第一个参数,实际上不是执行了 map(sys.stdout.write,‘a\n’)从而应该输出’a’么?
import sys
s=lambda x:map(sys.stdout.write,x)
t=s([‘a\n’,‘b\n’,‘c\n’])
print(t)
实际输出如下:
<map object at 0x01C2B210>
Python中关于sys.stdout.write的问题请教
4 回复
你不对 map 执行,它只是一个 map object,lazy evaluation
帖子标题:Python中关于sys.stdout.write的问题请教
sys.stdout.write() 是Python中一个底层的输出函数,它直接向标准输出流写入字符串,不自动添加换行符。和 print() 的主要区别在于:
- 不自动换行:
write()不会在字符串末尾添加换行符,你需要自己加\n。 - 返回值:它返回写入的字符数(整数),这个返回值常常被忽略。
- 灵活性:因为是文件对象的方法,你可以用它向任何类似文件的对象写入。
基本用法:
import sys
sys.stdout.write("Hello, ") # 不换行
sys.stdout.write("World!\n") # 自己加换行符
# 输出: Hello, World!
常见问题场景与代码示例:
1. 替代print实现无换行输出或自定义分隔符:
import sys
items = ['a', 'b', 'c']
for i, item in enumerate(items):
sys.stdout.write(item)
if i < len(items) - 1:
sys.stdout.write(' | ') # 用'|'分隔,而不是print的默认空格
# 输出: a | b | c
2. 实时进度条或动态更新行:
import sys
import time
for i in range(101):
sys.stdout.write(f"\rProgress: {i}%") # '\r'回到行首
sys.stdout.flush() # 立即刷新缓冲区
time.sleep(0.05)
sys.stdout.write("\nDone!\n")
3. 重定向输出时(比如到文件或StringIO):
import sys
from io import StringIO
# 捕获输出
output = StringIO()
old_stdout = sys.stdout
sys.stdout = output
sys.stdout.write("This goes to buffer, not screen.\n")
# 恢复并获取内容
sys.stdout = old_stdout
captured = output.getvalue()
print(f"Captured: {captured}")
为什么有时输出看起来“延迟”或“不显示”?
因为标准输出通常是行缓冲的。遇到换行符 \n 或缓冲区满时才会真正输出。解决方法:
- 写入
\n - 调用
sys.stdout.flush()强制立即输出 - 设置环境变量
PYTHONUNBUFFERED=1
总结:需要精细控制输出格式和时机时才用它,平时用 print() 更方便。
py3 吧。
py3 不像 py2 会直接返回 list 了,而是 iterator。
想得到输出的话,可以 list(t)

