代码之家  ›  专栏  ›  技术社区  ›  Ralf_Reddings

stdin未保存到文件

  •  0
  • Ralf_Reddings  · 技术社区  · 2 年前

    我正试图更好地理解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程序退出后仍然是空的。

    我试过了,控制台确实如图所示打印了它 HERE

    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的理解,这样我就可以解决 THIS 我昨天问的问题

    如有任何帮助,我们将不胜感激!

    2 回复  |  直到 2 年前
        1
  •  1
  •   ZeFerret    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 sys.stdin.buffer.read 函数,您将可以读取的数据量限制为12个字节。这意味着,如果您提供的数据超过12个字节,则其余数据将丢失。这也意味着,如果您提供的数据少于12字节,程序将在写入文件之前等待更多数据。

    向提供字符串“This is an example”后的文件输出 stdin :

    12
    b'This is an e'
    

    注: sys.stdin.buffer.read 提供原始数据 bytes 而不是 str 因此,为什么 b'...' 写入文件。

        2
  •  1
  •   Tim Roberts    2 年前

    你的基本哲学很好,但细节有缺陷。注意这个轻微的重写,使用 print 而不是 file.write 。您的写入调用无法工作,因为您混合了一个整数、一个Unicode字符串和一个字节字符串。这项工作:

    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$
    

    一般来说,这不是你使用的方式 stdin 在Python程序中。 stdin 往往是文本,所以我们使用 sys.stdin.readline for line in sys.stdin: ,或 fileinput 单元