众所周知,当遇到一个字符串的时候,.split()函数是非常常见的,那么,其实我在用这个函数之前也不知道这是干嘛用的,只是看到许多人在博客里写过。之前发现了一个特别难受的一个问题,就是!!!
我之前读取一个txt文件,也就是这玩意。
它里面是长这样的。
我在读取txt文件的时候,读取出来的数据看似正常,也都是一行一行读出来的数据,可是当时将其转换成np结构的时候,使用shape函数一看,是(120000,)这样的,当时我也没多想,就先用tensorflow中的tf.covert_to_tensor函数一转,报错了,说数据类型有问题,一看发现是str。
这个时候我头上冒黑人问号,意思就是直接读取的话就是读取出的字符串类型。那么我就需要将字符串里的数字转成整型或者浮点型。
先看一下我之前是怎么读取的
label = []
for line in open("/train_label.txt", "r"): # 设置文件对象并读取每一行文件
label.append(line) # 将每一行文件加入到list中
这样直接读取的话,label里面储存120000个str类,那么如何将整个字符串转换成数值呢?这个时候就需要split函数了,先上代码。
def str_trans_num(path,type):
b=[]
data = []
a = np.loadtxt(path, delimiter='\n', dtype=str) #读取文档
for i in range(len(a)):
b = a[i].split()
for j in range(len(b)):
b[j] = int(b[j])
data.append(b)
return data
首先读取文档,存入一个list中,直接用两个循环搞定。首先指定list a的长度,这样就知道里面有多少条str需要转成int型,再就是用b变量读取在a中第i个str,并且使用.split()函数。为什么这里要用split函数呢?
当前我们读取的test数据只有一个数值,类似于这种:[[1][2][3]]。但是一旦里面数据变多了,每一行的数据不止一个了,类似于这种:[[1 2 3][1 5 9][2 5 8]]。那这个时候就可以使用.splilt()将里面的以空格为分隔的数据分开,分开以后就相当于知道这个str类中有多少个数。那么就可以通过len方法,得出b数组的长度。再分别对里面的str类的“数字”进行强制转型成int类,再替换掉原来在b数组中的str的假“数字”就好了。最后将以假变真的里面都是int类的数组b使用append方法添入data中即可。
要注意的是,当数据中分割符号不是空格,是’/‘或者是其他的一些符号的时候,需要更改.split里面的参数,.split(‘填入更改的符号’)。如果说你只需要分割一次,那么就在符号后面加个1就行。下面举个栗子:
xxx.split(’/’,1)
这里就是以’/'为分隔符,将原数据一分为二。