这个问题的背景是我正在尝试编写一个程序来协助分析数据。它应该用python3编写,但是它的数据类型通常以python无法读取的格式存储。 有一个包来读取这些数据,但它只与python2兼容。为了读取数据,我因此想要编写一个python2脚本来读取文件并将其转换为numpy数组。我想在我的python3程序中阅读。 (有问题的包是axographio 1)。
一般来说,我想要的是:
给出像
这样的(python2)脚本#reading.py
import numpy
x = numpy.random.random(size=10000)
运行一个(python3),它可以以某种方式得到x
#analyze.py
import matplotlib.pyplot as plt
#fancyfunction that gets x from reading.py
plt.plot(x)
plt.show()
这里重要的是read.py由python2解释器执行,因为它不能用于python3。
答案 0 :(得分:6)
您是否尝试过挑选数据
在python 2中
import pickle
pickle.dumps(x)
在python 3中
import pickle
pickle.load(x)
如果我没记错的话,更好的方法是将你的numpy数组保存在python 2中的json文件中(可能使用panda over numpy),并在python 3中执行相反的操作
类似的东西:
df = pandas.Data[...]
有关详细信息,请参阅http://www.thegeeklegacy.com/t/how-to-import-without-using-import-in-python/35/#post-103
答案 1 :(得分:0)
以下是我使用的解决方案。
从subprocess
模块我使用带有参数Popen
的函数shell=True
从python3调用我的python2脚本并收集stdout
。 (这意味着所有内容都已打印到控制台。)
这是我想在python3中调用的python2代码:
#readying.py
import axographio #this is the python2 package
import os #specific to the problem of reading data
import sys #needed to use arguments from the command line
if __name__=='__main__': #when y
path = sys.argv[1]
filename = sys.argv[2]
os.chdir(path)
file = axographio.read(filename)
# print 'done reading files'
data = file.data
no_measurements = len(data)
measurement_len = len(data[0])
print(no_measurements)
print(measurement_len)
for i, name in enumerate(file.names):
print(name)
for i in range(no_measurements):
for j in range(measurement_len):
print(data[i][j])
print('next measurement')
#this acts as a seperator when reading the data in python3, anything that cannot be converted to a float works
这段代码的作用只是从commad行中获取参数。 (使用sys
模块,可以使用python2 script.py arg1 arg2 arg2
形式将命令行中的.py脚本传递给它们。
使用print语句给出reading.py
的输出。请注意,我单独打印每个数据,以避免截断输出。通过这种方式,输出是stdout
调用的标准输出python2
。
python3代码是
#analyze.py
import subprocess
import numpy as np
def read_data(path, filename):
module_name = 'reading.py'
cmd = 'python2 '+module_name+' '+path+' '+filename
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
out, err = p.communicate()
#out is a bytes object
result = out.split(b'\n') #the output from different print statements is seperated by "b'\n'" in the bytes object
#everything below here is concerned with unpacking the output and structuring it as I needed it
output = []
i = 0
while i < len(result):
output.append(result[i].decode("utf-8"))
i+=1
ind = 0 #this should keep track of where in the output list we are
no_measurements = int(output[ind])
ind += 1
measurement_len = int(output[ind])
ind += 1
names = []
for i in np.arange(ind,ind+no_measurements):
names.append(output[i])
ind += 1
data = []
measurement = []
while ind<len(output):
try:
measurement.append(float(output[ind]))
ind+=1
except:
data.append(measurement)
measurement = []
ind+=1
data = np.array(data)
return names, data
这样做是使用subprocess
模块作为shell命令python2 reading.py path filename
执行。如上所述,此调用的stdout
是其print
语句的输出。这些是用{UTF-8'编码的bytes
个对象。使用decode
方法,可以将它们转换为字符串对象,然后可以使用float
等函数更改类型。 (这是为什么单独打印所有内容非常有用的另一个原因,因为必须扫描字符串以查找数组或数字是相当烦人的。)在readying.py
中,数据在打印时明显分开,这使得它很容易一旦他们被阅读就构建它们。
标签:python3中的axographio - 读取axograph文件python3