如何在将文件读入numpy数组或类似

时间:2017-11-23 09:43:51

标签: python regex numpy parsing

我有这个txt文件:

.xsh 1:
..sxi
..kuxz
...iucdb
...khjub
..kjb
.hjub 2:
..ind
..ljnasdc
...kicd
...lijnbcd
.split 3:
..asd

我想将这个文件加载到一个numpy数组中(因为numpy可以快速使用)以使其更快我想在加载时开始解析。所以说我想让它在每个分隔符上分割文件

delim = '(^\.\w+\s\d+\:)'

现在我试着这样做:

import numpy as np
import os,re
path = 'C:\\temp'
filename = 'file.txt'
delim = '(^\.\w+\s\d+\:)'
delimFunc = (lambda s: re.split(delim,s))
fname = os.path.join(path,filename)
ar=np.loadtxt(fname, dtype = str, delimiter = delimFunc)
print len(ar)

这里它没有按照我想要的方式分割,而是在每个换行符上分割。是否有可能使numpy,pandas或任何其他快速库以我想要的方式运行?

我想要结果:

[[.xsh 1:
..sxi
..kuxz
...iucdb
...khjub
..kjb]
[.hjub 2:
..ind
..ljnasdc
...kicd
...lijnbcd]
[.split 3:
..asd]]

4 个答案:

答案 0 :(得分:0)

我认为pandas支持这种开箱即用,如果这是您的选择。

查看https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

sep arg:

  

sep:str,默认','

     

要使用的分隔符。如果sep为None,则C引擎无法自动检测分隔符,但Python解析引擎可以,这意味着后者将被使用并通过Python的内置嗅探器工具csv.Sniffer自动检测分隔符。此外,长度超过1个字符且与'\ s +'不同的分隔符将被解释为正则表达式,并且还将强制使用Python解析引擎。请注意,正则表达式分隔符很容易忽略引用的数据。正则表达式示例:'\ r \ t'

您还可以使用.values方法将pandas数据帧转换回numpy数组,而不会有太多麻烦

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.values.html

答案 1 :(得分:0)

我必须以不同的方式解决它,但仍然比以前更快:

import numpy as np
import os,re
import time
t1=time.time()
path = 'C:\\temp'
filename = 'file.txt'
delim = '(^\.\w+\s\d+\:)'
fname = os.path.join(path,filename)
ar=np.loadtxt(fname, dtype = str, delimiter = '\n')
x = np.array([],np.int32)
for (i,v) in enumerate(ar):
    if re.search(delim,v):
        x=np.append(x,i)

t2=time.time()
print np.split(ar,x)[1]
print 'Length of array:{0:d},took as long as {1:.2f} to complete'.format(len(x),(t2-t1))

答案 2 :(得分:0)

我会这样做

...
d = re.compile(delim)
# np.nonzero in this case returns a 1-uple of arrays, we have to unwrap
ixs = np.nonzero([d.search(item) for item in ar])[0]
splitted = np.split(ar, ixs if ixs[0] else ixs[1:])
...

ixs if ixs[0] else ixs[1:]表达式处理有效"分隔符"的可能性。在第一个记录中,以实现您在原始问题中显示的结果类型(即,没有记录的无效记录)。

答案 3 :(得分:0)

这就像你在找什么?

python.exe