Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用shell重定向时Python标准输出奇怪的值;仅当对输入的数据进行代数运算时_Python_Shell - Fatal编程技术网

使用shell重定向时Python标准输出奇怪的值;仅当对输入的数据进行代数运算时

使用shell重定向时Python标准输出奇怪的值;仅当对输入的数据进行代数运算时,python,shell,Python,Shell,我编写了一个脚本,用于对二进制时间序列数据执行一些简单的数值操作,这些数据以big endian 4 btye浮点形式输入,每个浮点都有一个头。它可以读入报头,解析数据,然后以与之相同的形式输出数据。如果我可以通过管道将数据从shell中进出,这样我就可以将其保存在我的工作流中,这将是最方便的。例如: file_在

我编写了一个脚本,用于对二进制时间序列数据执行一些简单的数值操作,这些数据以big endian 4 btye浮点形式输入,每个浮点都有一个头。它可以读入报头,解析数据,然后以与之相同的形式输出数据。如果我可以通过管道将数据从shell中进出,这样我就可以将其保存在我的工作流中,这将是最方便的。例如:

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')
本身不会做任何事情-您需要分配结果。不管怎样,正是
数据输出
需要改变其结尾。