首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Pythonic等效于Matlab的textscan

Pythonic等效于Matlab的textscan
EN

Stack Overflow用户
提问于 2018-07-17 23:06:50
回答 1查看 794关注 0票数 2

有一些类似的问题,但我找不到确切的答案。

我有一个非常奇怪的文本文件,它的代码行如下:

field1=1; field2=2; field3=3; field1=4; field2=5; field3=6;

Matlab的textscan()函数非常巧妙地处理了这个问题,因为您可以这样做:

array = textscan(fid, 'field1=%d; field2=%d; field3=%d;'

您将得到一个cell-array,其中每一列都包含相应的字段,文本被忽略。

我想用Python语言重写处理这个文件的代码,但是Numpy的loadtxt()genfromtxt()似乎没有这种能力来忽略散布着所需数字的文本?

Python有哪些方法可以剥离文本并只取回字段?如果需要,我很乐意使用pandas或其他库。谢谢!

编辑:This input被建议作为答案,但它只提供了与textscan的基本用法等效的内容,不处理输入中不需要的文本。下面关于fromregex的答案就是我需要的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-18 01:04:52

Numpy的fromregex函数与textscan基本相同。它允许您基于正则表达式读入,并将组(由()包围的部分)作为值。这适用于您的示例:

data = np.fromregex('temp.txt', r'field1=(\d+); field2=(\d+); field3=(\d+);', dtype='int')

您也可以使用loadtxt。有一个参数converters,它允许您提供执行从文本到数字的实际转换的函数。你可以提供一个函数,你只需要给它提供一个函数来去掉不需要的文本。

所以在我的测试中,这是可行的:

myconv = lambda x: int(x.split(b'=')[-1])
mycols = [0, 1, 2]
convdict = {i: myconv for i in mycols}
data = np.loadtxt('temp.txt', delimiter=';', usecols=mycols, converters=convdict)

myconv是一个匿名函数,它接受一个值(比如'field1=1'),将它拆分到'=',symbol (使['field1', '1']), takes the last result ('1'), the converts that to a float (1.`)。

mycols只是您想要保留的列的编号。因为在每一行的末尾有一个分隔符,所以这被算作空列。所以我们排除了这一点。

convdict是一个字典,其中每个键都是一个列号,每个值都是将该列转换为一个数字的函数。在这种情况下,它们都是相同的,但您可以随心所欲地自定义它们。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51384770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档