stdin 未保存到文件

stdin is not being saved to file

提问人:Ralf_Reddings 提问时间:11/12/2023 更新时间:11/12/2023 访问量:58

问:

我试图更好地了解 stdin 的工作原理以及如何在 Python 中专门使用它。

我正在尝试将从 stdin 收到的任何内容保存到文件中。该文件应有两行

  • 第一行应该是字符串的字母数
  • 第二行应该是字符串本身
rawLength = sys.stdin.buffer.read(12)
file = open("my_file.txt", "w") 
file.write(len(rawLength) + "\n" + rawLength)       #file.write(rawLength)  <== Does not work either
file.close

文件确实被创建,但没有任何反应。它是空的,并且在 Python 程序退出后保持为空。

我试过了这个,果然控制台确实打印了它,如图所示 这里

import time

rawLength = sys.stdin.buffer.read(12)    #save std to var
time.sleep(3)                            #because console window closes too fast
print(len(rawLength))
print(rawLength)
time.sleep(44)

这个练习的重点是增加我对 std 的理解,这样我就可以解决我昨天问的这个问题

任何帮助将不胜感激!

python 标准

评论

1赞 Carcigenicate 11/12/2023
file.close需要是 .IIRC,如果您不刷新它们或关闭文件,内容可能会卡在缓冲区中。file.close()
3赞 Tim Roberts 11/12/2023
您的代码不可能正常工作。 将失败,因为返回一个整数。向我们展示您正在使用的不起作用的确切代码。len(rawLength) + "\n"len
1赞 J_H 11/12/2023
在写入文件时,最好使用上下文管理器,以确保文件正确关闭。with
0赞 Ralf_Reddings 11/12/2023
@Carcigenicate,果然这就是我所经历的,我会研究你提到的这个同花顺的事情。干杯。

答:

2赞 Tim Roberts 11/12/2023 #1

你的基本理念很好,但细节是有缺陷的。请注意这个轻微的重写,使用 而不是 .写入调用无法正常工作,因为混合了整数、Unicode 字符串和字节字符串。这有效:printfile.write

import sys
rawLength = sys.stdin.buffer.read(12)
file = open("my_file.txt", "w") 
print(len(rawLength), file=file)
print(rawLength.decode(), file=file)
file.close()

输出:

timr@Tims-NUC:~/src$ python x.py
asdfhlaksjdf
timr@Tims-NUC:~/src$ cat my_file.txt 
12
asdfhlaksjdf
timr@Tims-NUC:~/src$

作为一般规则,这不是您在 Python 程序中的使用方式。 趋向于文本,所以我们使用 、 或 或模块。stdinstdinsys.stdin.readlinefor line in sys.stdin:fileinput

评论

0赞 Ralf_Reddings 11/12/2023
这是一个非常有趣的方式,谢谢你提供这个!
2赞 psysrc 11/12/2023 #2

正如其他一些人所说,您提供的代码本身不起作用,原因如下:

  • 您忘记导入sys
  • 您尝试使用带有整数(长度)和字符串的运算符+
  • 打电话时忘记括号file.close()

修复这些错误后,我能够使用 Python 3.10 成功运行它。这几乎会产生所需的输出,但有一些注意事项。

import sys

rawLength = sys.stdin.buffer.read(12)

file = open("my_file.txt", "w")

file.write(f"{len(rawLength)}\n{rawLength}")
file.close()

通过向函数提供,您可以读取的数据量限制为 12 个字节。这意味着,如果您提供的数据超过 12 个字节,其余部分将丢失。这也意味着,如果您提供的数据少于 12 字节,程序将在写入文件之前等待更多数据。12sys.stdin.buffer.read

将字符串“This is an example”提供给以下文件后的文件输出:stdin

12
b'This is an e'

注意:以原始数据的形式提供数据,而不是将 因此 why 写入文件。sys.stdin.buffer.readbytesstrb'...'

评论

0赞 Ralf_Reddings 11/12/2023
我现在明白了!干杯!