爱吃肥肉的马 发表于 2023-8-7 21:57:28

sys.stdout.write()疑问

import sys
content = input('请输入内容:')
con_txt = open('文档.txt','w',encoding='utf-8')
for item in content:
    sys.stdout.write(item)
    sys.stdout = con_txt
con_txt.close()

为什么我输入1234,但会在控制台输出1,234写入到文档里;而不是1234都写入到文档里

isdkz 发表于 2023-8-7 21:57:39

问题出在你在循环中将sys.stdout指向了con_txt,导致后续的输出都被重定向到了文档中。在循环开始之前,你应该将sys.stdout重新指向标准输出。以下是修改后的代码:

import sys
content = input('请输入内容:')
con_txt = open('文档.txt', 'w', encoding='utf-8')
stdout_backup = sys.stdout# 保存原始的sys.stdout对象
for item in content:
    sys.stdout.write(item)
sys.stdout = stdout_backup# 恢复原始的sys.stdout对象
con_txt.close()


这样修改后,你输入的1234就会同时在控制台和文档中输出。

学习编程中的Ben 发表于 2023-8-7 21:57:42

问题:

为什么我输入1234,但会在控制台输出1,234写入到文档里;而不是1234都写入到文档里。

回答:

这个问题出现的原因是将sys.stdout指向了文件对象后,所有的标准输出都会被重定向到该文件,而不再在控制台上显示。因此,你只能在控制台逐个字符地看到输出。

为了解决这个问题,可以将每个字符都先保存到一个字符串中,然后一次性将整个字符串写入文件。同时,还需要注意恢复正确的sys.stdout输出流。

以下是修改后的完整代码:

import sys

content = input('请输入内容:')
con_txt = open('文档.txt', 'w', encoding='utf-8')

# 保存输出内容的字符串
output_str = ""

for item in content:
    output_str += item
    sys.stdout.write(item)

# 恢复正确的 sys.stdout 输出流
sys.stdout = sys.__stdout__

# 将整个字符串写入文件
con_txt.write(output_str)
con_txt.close()


请将代码中的 文档.txt 替换成你想要保存输出的文件名。

如果回答对你有帮助,请给我一个最佳答案!{:10_254:}{:10_254:}{:10_254:}

陶远航 发表于 2023-8-7 22:00:29

首先,让我解释一下你的代码中的情况。

你使用了sys.stdout.write(item)将每个字符逐个输出到控制台。然后,你试图通过将sys.stdout重定向到文件来将输出写入文件中。

但是,在你的代码中,重定向文件的语句sys.stdout = con_txt被放在了循环内部。这意味着每循环一次,sys.stdout都会被重定向一次,导致只有最后一个字符被写入文件。

为了解决这个问题,你需要将sys.stdout = con_txt放在循环之前,而不是在循环内部。请参考下面修改后的代码:
import sys

content = input('请输入内容:')
con_txt = open('文档.txt', 'w', encoding='utf-8')

sys.stdout = con_txt# 将输出重定向到文件

for item in content:
    sys.stdout.write(item)

con_txt.close()
这样修改后,输入的内容 "1234" 将会完整地写入到文档中。

isdkz 发表于 2023-8-7 22:02:05

你在第一次循环的最后才重定向的,所以第一次循环的输出当然是输出到控制台了
页: [1]
查看完整版本: sys.stdout.write()疑问