温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

对python .txt文件读取及数据处理方法有哪些

发布时间:2021-07-26 10:12:54 来源:亿速云 阅读:188 作者:小新 栏目:开发技术

这篇文章给大家分享的是有关对python .txt文件读取及数据处理方法有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

1、处理包含数据的文件

最近利用Python读取txt文件时遇到了一个小问题,就是在计算两个np.narray()类型的数组时,出现了以下错误:

TypeError: ufunc 'subtract' did not contain a loop with signature matching types dtype('<U3') dtype('<U3') dtype('<U3')

作为一个Python新手,遇到这个问题后花费了挺多时间,在网上找了许多大神们写的例子,最后终于解决了。

总结如下:

(1)出现此问题的原因是:目的是想计算两个数组间的差值,但数组中的元素不是数据类型(float或int等),而是str类型的。

(2)解决方法:在为空数组添加数据过程中,将每个数据强制转化为float型。

如将“character.append(dataSet[i][:-1])”修改为“ character.append([float(tk) for tk in dataSet[i][:-1]])”

现将利用Python读取txt文件的过程总结如下:

python版本为python3.6

(1)函数定义,存放于Function.py文件中:

from numpy import * import random #读取数据函数,返回list类型的训练数据集和测试数据集 def loadData(fileName):   trainingData=[]  testData=[]  with open(fileName) as txtData:  lines=txtData.readlines()  for line in lines:   lineData=line.strip().split(',') #去除空白和逗号“,”   if random.random()<0.7:  #数据集分割比例   trainingData.append(lineData) #训练数据集   else:   testData.append(lineData) #测试数据集  return trainingData,testData #输入数据为list类型,分割数据集,分割为特征和标签两部分,返回数据为np.narray类型 def splitData(dataSet):   character=[]  label=[]  for i in range(len(dataSet)):  character.append([float(tk) for tk in dataSet[i][:-1]])  label.append(dataSet[i][-1])  return array(character),array(label)

(2)实现两个数组间的减法,存放于main.py文件中:

#__author__=='qustl_000' #-*- coding: utf-8 -*- import numpy as np import Function fileName="1.txt" trainingData,testData=Function.loadData(fileName) trainingCharacter,trainingLabel=Function.splitData(trainingData) testCharacter,testLabel=Function.splitData(testData) diff1=np.tile(testCharacter[0],(len(trainingCharacter),1))-trainingCharacter print('测试数据集的一条数据,扩充到与训练数据集同维:') print(np.tile(testCharacter[0],(len(trainingCharacter),1))) print('训练数据集:') print(trainingCharacter) print('作差后的结果:') print(diff1)

(3)运行结果:

测试数据集的一条数据,扩充到与训练数据集同维: [[ 1.5 60. ]  [ 1.5 60. ]  [ 1.5 60. ]  [ 1.5 60. ]  [ 1.5 60. ]  [ 1.5 60. ]  [ 1.5 60. ]  [ 1.5 60. ]  [ 1.5 60. ]  [ 1.5 60. ]  [ 1.5 60. ]  [ 1.5 60. ]  [ 1.5 60. ]] 训练数据集: [[ 1.5 40. ]  [ 1.5 50. ]  [ 1.6 40. ]  [ 1.6 50. ]  [ 1.6 60. ]  [ 1.6 70. ]  [ 1.7 60. ]  [ 1.7 70. ]  [ 1.7 80. ]  [ 1.8 60. ]  [ 1.8 80. ]  [ 1.8 90. ]  [ 1.9 90. ]] 作差后的结果: [[ 0. 20. ]  [ 0. 10. ]  [ -0.1 20. ]  [ -0.1 10. ]  [ -0.1 0. ]  [ -0.1 -10. ]  [ -0.2 0. ]  [ -0.2 -10. ]  [ -0.2 -20. ]  [ -0.3 0. ]  [ -0.3 -20. ]  [ -0.3 -30. ]  [ -0.4 -30. ]]

数据集如下:

1.5,40,thin 1.5,50,fat 1.5,60,fat 1.6,40,thin 1.6,50,thin 1.6,60,fat 1.6,70,fat 1.7,50,thin 1.7,60,thin 1.7,70,fat 1.7,80,fat 1.8,60,thin 1.8,70,thin 1.8,80,fat 1.8,90,fat 1.9,80,thin 1.9,90,fat

2、处理文本文件,如情感识别类的文件

在进行文本的情感分类时,从电影评论数据集网站上下载数据集后,发现数据集中存在许多不需要的符号。截取部分包含多余字符的数据如下:

对python .txt文件读取及数据处理方法有哪些

下载数据集后,所有txt文件存放在两个文件夹:“neg”(包含消极评论)和“pos”(包含积极地评论)中。

两者的存放目录如下:“F:\Self_Learning\机器学习\python\Bayes\review_polarity\txt_sentoken”。后面需要用到文件路径,此路径可根据自己存放目录修改。

主要涉及到的python操作有:多余字符的删除、文件夹中多文件的操作。

2.1 多余字符的删除

首先,我们要删除多余的符号,获得干净的数据。

经过查找资料,知道删除一条文本数据中不需要的符号,可以通过re.sub(chara,newChara,data)函数实现,其中chara是需要删除的字符,newChara是删除字符后相应位置的替换字符,data是需要操作的数据。比如下面的代码,指的是删除lines中包含的前面列出的字符,并用空白替换:

lineString = re.sub("[\n\.\!\/_\-$%^*(+\"\')]+|[+—()?【】“”!:,;.?、~@#¥%…&*()0123456789]+", " ", lines)

2.2 python对多文件的操作

下面的程序中,pathDirPos指的是所有积极评论的txt文件所在的目录,在此指的是“F:\Self_Learning\机器学习\python\Bayes\review_polarity\txt_sentoken\pos”。child就是获得的每个txt文件全名。

 for allDir in pathDirPos:  child = os.path.join('%s' % allDir)

2.3 电影评论数据集预处理

下面给出对于电影评论数据集的预处理程序(python3.6).

'''获取数据,并去除数据中的多余符号,返回list类型的数据集''' def loadData(pathDirPos,pathDirNeg):  posAllData = [] # 积极评论  negAllData = [] # 消极评论  # 积极评论  for allDir in pathDirPos:  lineDataPos = []  child = os.path.join('%s' % allDir)  filename = r"review_polarity/txt_sentoken/pos/" + child  with open(filename) as childFile:   for lines in childFile:   lineString = re.sub("[\n\.\!\/_\-$%^*(+\"\')]+|[+—()?【】“”!:,;.?、~@#¥%…&*()0123456789]+", " ", lines)   line = lineString.split(' ') #用空白分割每个文件中的数据集(此时还包含许多空白字符)   for strc in line:    if strc != "" and len(strc) > 1: #删除空白字符,并筛选出长度大于1的单词    lineDataPos.append(strc)   posAllData.append(lineDataPos)  # 消极评论  for allDir in pathDirNeg:  lineDataNeg = []  child = os.path.join('%s' % allDir)  filename = r"review_polarity/txt_sentoken/neg/" + child  with open(filename) as childFile:   for lines in childFile:   lineString = re.sub("[\n\.\!\/_\-$%^*(+\"\')]+|[+—()?【】“”!:,;.?、~@#¥%…&*()0123456789]+", " ", lines)   line = lineString.split(' ') #用空白分割每个文件中的数据集(此时还包含许多空白字符)   for strc in line:    if strc != "" and len(strc) > 1: #删除空白字符,并筛选出长度大于1的单词    lineDataNeg.append(strc)   negAllData.append(lineDataNeg)  return posAllData,negAllData '''划分数据集,将数据集划分为训练数据和测试数据,参数splitPara为分割比例''' def splitDataSet(pathDirPos,pathDirNeg,splitPara):  trainingData=[]  testData=[]  traingLabel=[]  testLabel=[]  posData,negData=loadData(pathDirPos,pathDirNeg)  pos_len=len(posData)  neg_len=len(negData)  #操作积极评论数据  for i in range(pos_len):  if(random.random()<splitPara):   trainingData.append(posData[i])   traingLabel.append(1)  else:   testData.append(posData[i])   testLabel.append(1)  for j in range(neg_len):  if(random.random()<splitPara):   trainingData.append(negData[j])   traingLabel.append(0)  else:   testData.append(negData[j])   testLabel.append(0)  return trainingData,traingLabel,testData,testLabel

感谢各位的阅读!关于“对python .txt文件读取及数据处理方法有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI