python具体在文本处理上怎么用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python具体在文本处理上怎么用相关的知识,希望对你有一定的参考价值。

在诸多软件压缩包中或是项目压缩包中都会存在一个readme.txt文件,其中的内容无非是对软件的简单介绍和注意事项。但是在该文本文件中,内容没有分段分行,是非常冗杂地混在一起。当然处理手段多种多样,而我正好尝试利用Python解决这个问题。另外,这些内容或许对将来爬虫爬下的内容进行处理也是有些帮助的,只不过面对的混乱和处理需求不同而已。
这里的思路很简单,打开一个文本文档,对其中具有两个及两个以上的空格进行处理,即产生换行,另外出现很多的‘=’和‘>>>’也进行处理。这里我尝试处理的是easyGUI文件夹中的read.txt,该文件我复制在了D盘的根目录下。具体的实现代码如下:
def save_file(lister):#将传入的列表保存在新建文件中 new_file = open('new_file','w')#创建并打开文件,文件可写 new_file.writelines(lister)#将列表lister中的内容逐行打印 new_file.close()#关闭文件,且缓存区中的内容保存至该文件中def split_file(filename):#分割原始文件 f = open(filename)#打开该原始文件,默认该文件不可修改 lister = []#初始化一个空列表 for each_line in f: if each_line[:6] != '======' and each_line[:3] != '>>>': #当连续出现六个‘=’或连续三个‘>’时,打印一个换行符,实际体现在else中 each_line.split(' ',1)#当出现两个空格时,分割一次,并在下一行代码中以一行的形式保存在列表中 lister.append(each_line) else:
lister.append('\n')

save_file(lister)
f.close()

split_file('D:\\README.txt')
代码给出了详细的注释。其中得到的新的名为“new_file”的文件保存在默认的Python项目的目录下。当然,可以通过chdir()更改工作目录,使得文件创建在自己指定的位置。
参考技术A 首先切割数据到小文件:

#coding:utf-8

#file: FileSplit.py

import os,os.path,time

def FileSplit(sourceFile, targetFolder):

sFile = open(sourceFile, 'r')

number = 100000 #每个小文件中保存100000条数据

dataLine = sFile.readline()

tempData = [] #缓存列表

fileNum = 1

if not os.path.isdir(targetFolder): #如果目标目录不存在,则创建

os.mkdir(targetFolder)

while dataLine: #有数据

for row in range(number):

tempData.append(dataLine) #将一行数据添加到列表中

dataLine = sFile.readline()

if not dataLine :

break

tFilename = os.path.join(targetFolder,os.path.split(sourceFile)[1] + str(fileNum) + ".txt")

tFile = open(tFilename, 'a+') #创建小文件

tFile.writelines(tempData) #将列表保存到文件中

tFile.close()

tempData = [] #清空缓存列表

print(tFilename + " 创建于: " + str(time.ctime()))

fileNum += 1 #文件编号

sFile.close()

if __name__ == "__main__" :

FileSplit("access.log","access")

2. 对小文件分类汇总

#coding:utf-8

#file: Map.py

import os,os.path,re

def Map(sourceFile, targetFolder):

sFile = open(sourceFile, 'r')

dataLine = sFile.readline()

tempData = #缓存列表

if not os.path.isdir(targetFolder): #如果目标目录不存在,则创建

os.mkdir(targetFolder)

while dataLine: #有数据

p_re = re.compile(r'(GET|POST)\s(.*?)\sHTTP/1.[01]',re.IGNORECASE) #用正则表达式解析数据

match = p_re.findall(dataLine)

if match:

visitUrl = match[0][1]

if visitUrl in tempData:

tempData[visitUrl] += 1

else:

tempData[visitUrl] = 1

dataLine = sFile.readline() #读入下一行数据

sFile.close()

tList = []

for key,value in sorted(tempData.items(),key = lambda k:k[1],reverse = True):

tList.append(key + " " + str(value) + '\n')

tFilename = os.path.join(targetFolder,os.path.split(sourceFile)[1] + "_map.txt")

tFile = open(tFilename, 'a+') #创建小文件

tFile.writelines(tList) #将列表保存到文件中

tFile.close()

if __name__ == "__main__" :

Map("access\\access.log1.txt","access")

Map("access\\access.log2.txt","access")

Map("access\\access.log3.txt","access")

最后全部分类汇总得到一个文件:

#coding:utf-8

#file: Reduce.py

import os,os.path,re

def Reduce(sourceFolder, targetFile):

tempData = #缓存列表

p_re = re.compile(r'(.*?)(\d1,$)',re.IGNORECASE) #用正则表达式解析数据

for root,dirs,files in os.walk(sourceFolder):

for fil in files:

if fil.endswith('_map.txt'): #是reduce文件

sFile = open(os.path.abspath(os.path.join(root,fil)), 'r')

dataLine = sFile.readline()

while dataLine: #有数据

subdata = p_re.findall(dataLine) #用空格分割数据

#print(subdata[0][0]," ",subdata[0][1])

if subdata[0][0] in tempData:

tempData[subdata[0][0]] += int(subdata[0][1])

else:

tempData[subdata[0][0]] = int(subdata[0][1])

dataLine = sFile.readline() #读入下一行数据

sFile.close()

tList = []

for key,value in sorted(tempData.items(),key = lambda k:k[1],reverse = True):

tList.append(key + " " + str(value) + '\n')

tFilename = os.path.join(sourceFolder,targetFile + "_reduce.txt")

tFile = open(tFilename, 'a+') #创建小文件

tFile.writelines(tList) #将列表保存到文件中

tFile.close()

if __name__ == "__main__" :

Reduce("access","access")

用python处理文本数据 学到的一些东西

最近写了一个python脚本,用TagMe的api标注文本,并解析返回的json数据。在这个过程中遇到了很多问题,学到了一些新东西,总结一下。

1. csv文件处理

csv是一种格式化的文件,由行和列组成,分隔符可以根据需要发生变化。只有分隔符为逗号‘,‘时,才会在excel中显示为列。

python的csv模块提供了reader和writer函数来读写csv格式的数据。

csv.reader(csvfiledialect=‘excel‘**fmtparams)

csv.writer(csvfiledialect=‘excel‘**fmtparams)

csvfile要是可以支持迭代操作的对象,比如file object或者是list object。

**If csvfile is a file object, it must be opened with the ‘b’ flag on platforms where that makes a difference.

csv模块不支持Unicode字符的输入,所有的输入应该是UTF-8编码或者ASCII。

官方文档:https://docs.python.org/2/library/csv.html

 

2.字符编码

python 2的默认字符编码是ASCII,因此在处理的字符流不属于ASCII范围时,就会抛出异常UnicodeEncodeError:......:ordinal not in range(128)。

一种解决的方法是修改python 2的默认编码,可以直接在程序中声明:

import sys
reload(sys)
sys.setdefaultencoding(utf-8)

但是这种方法会给程序留下一些bug,具体可参考:

http://blog.ernest.me/post/python-setdefaultencoding-unicode-bytes

 

3. json处理

python提供了json模块,可以用来解析json格式的字符串或者文件。

json.dump(objfpskipkeys=Falseensure_ascii=Truecheck_circular=True,allow_nan=Truecls=Noneindent=Noneseparators=Noneencoding="utf-8",default=Nonesort_keys=False**kw)

将一个object序列化为一个json格式的数据流,并输出到file object中。

json.dumps(objskipkeys=Falseensure_ascii=Truecheck_circular=Trueallow_nan=Truecls=Noneindent=None,separators=Noneencoding="utf-8"default=Nonesort_keys=False**kw)

一个object序列化为一个json格式的字符串。

json.load(fp[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])

将一个json格式的file object加载为python object。

json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[,**kw]]]]]]]])

将一个json格式的字符串加载为python object。

官方文档:https://docs.python.org/2.7/library/json.html?highlight=json

 

4. traceback

python提供了处理异常栈的模块traceback,可以提供当前异常的具体信息,如异常位置、出现异常的语句、异常类型等。

traceback.print_exc(file=sys.stdout)  #在终端中输出异常信息

fp=open("error.txt",‘w‘)

traceback.print_exc(file=fp) #将错误信息输出到文件中

traceback.format_exc() #将错误信息转化为字符串类型

关于python traceback模块 可以参考这篇博客:http://www.tuicool.com/articles/f2uumm

 

5. 格式化输出

http://www.pythondoc.com/pythontutorial3/inputoutput.html

 

6. 文件重命名

import os
os.rename(src,dst)

    src——要修改的文件名,dst——修改后的文件名。

    重命名时,如果新文件名已经存在,就会报‘WindowsError: [Error 183]’ 错误。

以上是关于python具体在文本处理上怎么用的主要内容,如果未能解决你的问题,请参考以下文章

python处理文本

python字典中,有个文本, 两列值 1对多关系,请问怎么把key和value都放在字典里呢?

WPF 文本框没有单击事件吗?如果想用单击事件怎么处理

python 文本文件数据处理

Pyp–一个替代sed,awk的文本处理工具

python,爬虫,pandas的DataFrame处理后的数据,输出到文本后中间这些数据都没有展开怎么办