使用shell重定向时Python标准输出奇怪的值;仅当对输入的数据进行代数运算时
我编写了一个脚本,用于对二进制时间序列数据执行一些简单的数值操作,这些数据以big endian 4 btye浮点形式输入,每个浮点都有一个头。它可以读入报头,解析数据,然后以与之相同的形式输出数据。如果我可以通过管道将数据从shell中进出,这样我就可以将其保存在我的工作流中,这将是最方便的。例如:使用shell重定向时Python标准输出奇怪的值;仅当对输入的数据进行代数运算时,python,shell,Python,Shell,我编写了一个脚本,用于对二进制时间序列数据执行一些简单的数值操作,这些数据以big endian 4 btye浮点形式输入,每个浮点都有一个头。它可以读入报头,解析数据,然后以与之相同的形式输出数据。如果我可以通过管道将数据从shell中进出,这样我就可以将其保存在我的工作流中,这将是最方便的。例如: file_在
file_在
现在我有了一个脚本,可以毫无问题地读入数据并将数据写回STDOUT——我可以确认数据和标题与输入的相同。我可以对数组元素进行一些简单的移位,比如np.roll(data),这也很好。但是,当我尝试对值本身执行任何操作时,例如,将它们乘以1.0,输出数据中的值不再正确(它们从~1e1到~1e36,并且完全被置乱)。在所有情况下,收割台都保持良好状态。请看下面我的代码
我尝试使用data.astype('>f')
显式设置数组数据类型,但没有效果。不知道还有什么可以尝试的
#!/usr/bin/env python
"""
IN: STDIN
OUT: STDOUT
"""
import sys
import numpy as np
while True: #open and write out one trace at a time
""" IMPORT TRACE HEADER """
header_data=sys.stdin.read(240) #read in first 240 btyes
if len(header_data)==0: break
#open all two and four byte headers
four_byte = np.fromstring(header_data, dtype='>i4')
two_byte=np.fromstring(header_data, dtype='>i2')
ns=two_byte[57] # ns is necessary to parse in trace data
dt=two_byte[58]*1e-6 #example 2-byte header from byte 58
""" IMPORT TRACE DATA """
data=np.fromstring(sys.stdin.read(4*ns), dtype='>f4') #4 bytes per sample
""" INSERT NUMERICAL OPERATIONS HERE """
data_out = data # gives a good output
data_out = np.roll(data,10) # gives a good output
data_out = data * 1. # does not give a good output!
data_out = data + np.ones((ns)) # does not give a good output!
""" WRITE OUT """
sys.stdout.write(header_data)
sys.stdout.write(data_out)
sys.stdout.close()
#END
对数据执行实际计算可能会以计算机的本机endianness生成输出,前提是在进一步处理时这将大大加快。在写出数组之前,您需要显式地转换回big-endian。感谢您的及时回复。我想你是对的,但我尝试了data.astype('>f'),但没有成功。然而,我刚刚找到了一个解决办法,通过这样的索引:data_out[0:ns]=data*1。这样做时,它必须按照您的建议保留数组的原始结尾。
data.astype('>f')
本身不会做任何事情-您需要分配结果。不管怎样,正是数据输出
需要改变其结尾。