python快速读取文件内容的方法(.txt文件读取及数据处理总结)
python快速读取文件内容的方法(.txt文件读取及数据处理总结)现将利用Python读取txt文件的过程总结如下: 如将“character.append(dataSet[i][:-1])”修改为“ character.append([float(tk) for tk in dataSet[i][:-1]])”总结如下: (1)出现此问题的原因是:目的是想计算两个数组间的差值,但数组中的元素不是数据类型(float或int等),而是str类型的。 (2)解决方法:在为空数组添加数据过程中,将每个数据强制转化为float型。
1、处理包含数据的文件
最近利用python读取txt文件时遇到了一个小问题,就是在计算两个np.narray()类型的数组时,出现了以下错误:
TypeError: ufunc 'subtract' did not contain a loop with signature matching types dtype('<U3') dtype('<U3') dtype('<U3')
- 1
作为一个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):
下载数据集后,所有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)
- 1
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)
- 1
- 2
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