Python 为什么可以';我是否将sys.stdin中的所有数据写入Windows中的文件?
我试图在Windows XP上使用Python 2.7从sys.stdin读取二进制数据。二进制数据是由foobar2000解码的WAV文件。通常,这些数据被发送到命令行编码器,如stdin上的lame.exe,在那里处理并写入一个输出文件,该文件的名称在命令行参数中提供。我试图截取输出的WAV数据并将其发送到另一个文件。然而,在管道明显崩溃之前,我只能从stdin中获得几KB,因此我只剩下一个非常短(约75 KB)的WAV文件,而不是我所期望的几十兆字节。这可能是什么原因造成的?我一直小心地将sys.stdin和输出文件作为二进制文件打开Python 为什么可以';我是否将sys.stdin中的所有数据写入Windows中的文件?,python,windows,io,binary-data,Python,Windows,Io,Binary Data,我试图在Windows XP上使用Python 2.7从sys.stdin读取二进制数据。二进制数据是由foobar2000解码的WAV文件。通常,这些数据被发送到命令行编码器,如stdin上的lame.exe,在那里处理并写入一个输出文件,该文件的名称在命令行参数中提供。我试图截取输出的WAV数据并将其发送到另一个文件。然而,在管道明显崩溃之前,我只能从stdin中获得几KB,因此我只剩下一个非常短(约75 KB)的WAV文件,而不是我所期望的几十兆字节。这可能是什么原因造成的?我一直小心地将
from __future__ import print_function
import os
import os.path
import sys
sys.stdin = os.fdopen(sys.stdin.fileno(), 'rb', 0) # Make sys.stdin binary
wave_fname = os.path.join(os.environ['USERPROFILE'], 'Desktop',
'foobar_test.wav')
try:
os.remove(wave_fname)
except Exception:
pass
CHUNKSIZE = 8192
wave_f = open(wave_fname, 'wb')
try:
bytes_read = sys.stdin.read(CHUNKSIZE)
while bytes_read:
for b in bytes_read:
wave_f.write(b)
bytes_read = sys.stdin.read(CHUNKSIZE)
finally:
pass
wave_f.close()
建议:也许你需要使用
msvcrt.setmode(fd,flags)
,其中fd
是sys.stdin.fileno()
,它工作得很好,但是为什么os.fdopen(sys.stdin.fileno(),'rb',0)不工作呢?@ascent1729:可能是因为它正在将'b'
(太晚)应用到它从底层文件获取的字节,它以文本模式打开。使用msvcrt.setmode
将其更改为二进制模式。