有一些与此类似的问题,但我找不到确切的答案。
我有一个非常奇怪的文本文件,其内容如下:field1=1; field2=2; field3=3;field1=4; field2=5; field3=6;
Matlab的textscan()
函数可以非常巧妙地处理此问题,因为您可以执行以下操作:array = textscan(fid, 'field1=%d; field2=%d; field3=%d;'
然后您将返回一个单元格数组,其中每一列都包含各自的字段,而文本将被忽略。
我想用Python重写处理此文件的代码,但是Numpy的loadtxt()
和genfromtxt()
似乎没有这种能力来忽略散布有所需数字的文本?
有什么Python方法可以去除文本并仅返回字段?如果需要,我很高兴使用pandas
或其他库。谢谢!
编辑:建议使用This问题作为答案,但是它仅给出textscan
的基本用法的等效内容,该基本用法不处理输入中不需要的文本。 fromregex
下面的答案是我需要的。
最佳答案
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'
),将其分割为'='
符号(使['field1', '1']), takes the last result (
'1'), the converts that to a float (
1。')。mycols
只是您要保留的列数。由于每行末尾都有一个定界符,因此将其视为空列。因此,我们将其排除在外。convdict
是字典,其中每个键是一个列号,每个值是将该列转换为数字的函数。在这种情况下,它们都是相同的,但是您可以根据需要自定义它们。关于python - 等同于Matlab的textscan的Pythonic,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51384770/