我有这个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]]
答案 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