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() 的主要区别在于:

  1. 不自动换行write() 不会在字符串末尾添加换行符,你需要自己加 \n
  2. 返回值:它返回写入的字符数(整数),这个返回值常常被忽略。
  3. 灵活性:因为是文件对象的方法,你可以用它向任何类似文件的对象写入。

基本用法:

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)

回到顶部