有一些类似的问题,但我找不到确切的答案。
我有一个非常奇怪的文本文件,它的代码行如下:
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
的答案就是我需要的。
发布于 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
是一个字典,其中每个键都是一个列号,每个值都是将该列转换为一个数字的函数。在这种情况下,它们都是相同的,但您可以随心所欲地自定义它们。
https://stackoverflow.com/questions/51384770
复制相似问题