python提取txt字符串_python把txt中字符串數據提取為numpy數組

本文介绍了如何使用Python的numpy、列表操作和正则表达式从txt文件中提取字符串数据并转换为numpy数组。通过strip()、split()函数处理txt文件中的数据,去除不需要的字符,最后将数据转换为整数型numpy数组。
摘要由CSDN通过智能技术生成

本人模式小白,剛剛開始學python,主要是用numpy、scipy、matplotlib、pandas以及scikit-learn做數據處理及機器學習相關的東西。目前讀研一,希望和大家多多交流!

對於模式識別中的各個方向,我個人覺得就是傳感器不同,圖像處理用的是視覺、肌電用的是肌電貼、腦電用的是腦電采集設備、語音用的是麥克風。。。最終都是轉換成對數據的處理,如何從看似雜亂無章的數據中提取有用的信息,並進行分類操作等,就是特征提取。特征提取有很多種方法,這里就不說了,我也是剛剛起步,先把實驗數據存到numpy數組中才是最基礎的~~

一般來說做實驗的時候把實驗數據保存txt文件中,然后利用實驗數據進行離線的訓練及測試。下面的數據是利用MYO手環做肌電實驗保存的。

[-6, -7, 29, -19, -8, -10, -2, -2][3, -8, -21, -8, 0, 2, 10, -9][-6, -1, -8, 30, -5, -4, 4, -4][9, 25, 22, -1, 4, -4, 0, 10][29, 9, 25, 14, -6, -1, 3, 3][18, 4, 68, 27, -1, -3, -16, 8][0, 1, -21, -21, 1, -4, 0, 10][-3, -3, -3, -59, -5, 6, 7, -2][6, -2, 34, 6, -1, 12, -4, -38]

[0, -3, -20, -12, -5, -5, -23, 2][-8, -6, 55, 37, -4, -9, 3, 17]

[-8, -20, -6, 20, -7, -4, 6, 4].......

由於數據非常多,這里只寫出一小部分。在txt文件中的數據都是以字符串的形式保存的,每一行的結尾都會存在一個‘\n’的字符,另外從數據中還可以看出來‘[’,‘]’,‘,’以及‘ ’都不是我們要提取的信息,所以在處理的過程中要把這些字符刪除。由於里面還會有負數,所以導致各行數據的長度也都不一樣,而且‘-’也是一個字符,並不能直接靠特定字符位置進行處理。

還好python有強大的列表功能,strip(),split()函數可以幫助我們完成這項任務。先簡單介紹一下這兩個函數:

strip(rm):刪除s字符串中開頭、結尾處,rm字符。當rm為空時默認刪除空白符(包括'\n', '\r',  '\t',  ' ')

split(del):通過指定分隔符(del)對字符串進行切片,如果參數num有指定值,則僅分隔num個子字符串。

import numpy as np

file = open("1.txt","r")

list_arr = file.readlines()

l = len(list_arr)

for i in range(l):

list_arr[i] = list_arr[i].strip()

list_arr[i] = list_arr[i].strip('[]')

list_arr[i] = list_arr[i].split(", ")

a = np.array(list_arr)

a = a.astype(int)

print (a)

file.close()

利用for循環對列表list_arr中每一個元素進行處理,最后用numpy中的array函數將其轉換成numpy數組,並用astype函數把字符串數組轉換成int數組。輸出結果如下:

[[ -3   3   2 ...,  -2  -6  -4]

[  2   9 -64 ..., -10  14  -2]

[ -1  -1 -20 ...,  13  -6   1]

...,

[  0 -38 -23 ...,   1  -1   0]

[-11   4 -56 ...,   0  -1  -6]

[-12 -51 -75 ...,   2   0  -4]]

結果是一個二位數組,這樣后面我們對這個數組進行一些科學計算操作就會變得很方便了。

這種方法是我最開始寫的,獲取列表list_arr的長度進行循環,這是傳統的c語言的思想,接觸python后,列表有自己風格的迭代:

import numpy as np

file = open("1.txt","r")

list_arr = file.readlines()

lists = []

for index,x in enumerate(list_arr):

x = x.strip()

x = x.strip('[]')

x = x.split(", ")

lists.append(x)

a = np.array(lists)

a = a.astype(int)

print (a)

file.close()

for index,x in enumerate(list_arr) 是python列表特有的迭代風格,表示列表中第index個元素x,每次遍歷一遍index會加1,x也會變成下一個元素。當然這里沒有用到index,只是為了表達python迭代的風格。這里可以用for x in list_arr:這條語句代替,也挺酷的~  append(x)函數是在原有列表基礎上添加一個元素x。

當然,對於字符串操作還有一個利器:正則表達式!

import numpy as np

import re

file = open("1.txt","r")

list_arr = file.readlines()

lists = []

r = '[’,[\\]]'

for index,x in enumerate(list_arr):

a = re.sub(r,'',x)

c = a.strip()

c = c.split()

lists.append(c)

m = np.array(lists)

m = m.astype(int)

print (m)

file.close()

如果不了解正則表達式又想用它來刪除字符串中特定字符的話,這個是萬能的,自己刪吧!

r

=

'[’!"#$%&

\'

()*+,./:;<=>?@[

\\

]^_`{|}~]'

對於這三種方法,我進行了一下測試,發現前兩種差距不大,正則表達式則慢很多。相比較而言的話,我更偏向於第二種方法,畢竟這才是python嘛~

由於初步學習,難免會有說錯的地方,希望大家能批評指出!另外,代碼也是存在很多不規范,代優化的地方,以后會慢慢改進的!最后附上測試代碼,測試哪部分就把哪的注釋給去掉就行了。

import time

import numpy as np

import re

start = time.time()

for y in range(1000):

file = open("1.txt","r")

list_arr = file.readlines()

'''

l = len(list_arr)

for i in range(l):

list_arr[i] = list_arr[i].strip()

list_arr[i] = list_arr[i].strip('[]')

list_arr[i] = list_arr[i].split(", ")

a = np.array(list_arr)

a = a.astype(int)

print (a)

'''

'''

lists = []

for x in list_arr:

x = x.strip()

x = x.strip('[]')

x = x.split(", ")

lists.append(x)

a = np.array(lists)

a = a.astype(int)

print (a)

'''

'''

lists = []

r='[’,[\\]]'

for index,x in enumerate(list_arr):

a = re.sub(r,'',x)

c = a.strip()

c = c.split()

lists.append(c)

m = np.array(lists)

m = m.astype(int)

print (m)

'''

file.close()

print ((time.time()-start)/1000)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值