我正在将一些Matlab代码转移到Python。我是Python的新手,并且不确定Python等效于Matlab的textscan
方法。任何帮助将不胜感激。
答案 0 :(得分:6)
如果您正在将Matlab翻译成Python,我会假设您已经在使用NumPy。
在这种情况下,您可以使用np.loadtxt
(如果没有值丢失)或np.genfromtxt
(如果缺少值:我不确定Matlab的textscan
是否处理该值)
如果您需要更多帮助,请提供更多详细信息!
答案 1 :(得分:5)
将MATLAB的textscan
转换为Python + NumPy np.loadtxt
的示例:
让我们的数据文件results.csv
包含:
0.6236,sym2,1,5,10,10
0.6044,sym2,2,5,10,10
0.548,sym2,3,5,10,10
0.6238,sym2,4,5,10,10
0.6411,sym2,5,5,10,10
0.7105,sym2,6,5,10,10
0.6942,sym2,7,5,10,10
0.6625,sym2,8,5,10,10
0.6531,sym2,9,5,10,10
Matlab代码:
fileID = fopen('results.csv');
d = textscan(fileID,'%f %s %d %d %d %d', 'delimiter',',');
fclose(fileID);
Python + NumPy代码:
fd = open('results2.csv','r')
d = np.loadtxt(fd,
delimiter=',',
dtype={'names': ('col1', 'col2', 'col3', 'col4', 'col5', 'col6'),
'formats': ('float', 'S4', 'i4', 'i4', 'i4', 'i4')})
fd.close()
有关类型的详细信息,请参阅Data type objects (dtype)。
答案 2 :(得分:4)
你必须寻找Numpy和py2mat。如果我对textscan()的理解是正确的,你可以使用open()
答案 3 :(得分:1)
如果结果比简单的带分隔符的文本还要复杂(例如,如果有其他无用的文本混入其中),则可以使用Numpy的fromregex
函数替换textscan
。 fromregex
使您可以基于正则表达式读入,并使用组(由()
包围的部分)作为值。
例如,假设您有这样的行:
field1 is 1, field 2 is 5 to 6.6
field1 is 2, field 2 is 7 to 0.1
您想获取值编号(而不是字段名称):
[[1, 5, 6.6],
[2, 7, 0.1]]
您可以
data = np.fromregex('temp.txt', r'field1 is ([\d\.]+), field 2 is ([\d\.]+) to ([\d\.]+)', dtype='float')
[\d\.]+
匹配任何数字,包括小数位,而()
告诉numpy使用该结果作为值。您还可以指定更复杂的dtype,例如使不同的列具有不同的类型,以及指定列名以提供结构化数组。文档中对此进行了介绍。
但是,在处理简单的定界或固定宽度数据时,它比其他方法更为复杂。