使用python统计博客文章
0赞目前我写博客都是用word写完后,再使用live writer上传到网站上。同时还会将博客保存成pdf。今天突然想到想统计一下目前写的博客文章。最简单的方法就是去博客的各个目录去看一下有多少,然后统计到excel中。但是作为程序员的我们,怎么可能用这么笨的方法,这不,用python来解决。
首先,先用designer设计界面,并连接信号与槽。文章只有pdf和word格式,所有只有两个选项。红色框,就是上一篇博客写的tableWidget控件。
将界面的ui文件转换为py文件。在py文件中,先定义槽函数,不然运行会报错。这里,先不实现函数的内容。等后面在实现。
def tongji(self): pass def cellclicked(self,row,col): pass def excel_gen(self): pass
编写main的py,这个文件代码就是例化上面实现的界面类。
import ui1 import sys from PyQt4.QtCore import * from PyQt4.QtGui import * class Ui(QWidget,ui1.Ui_Form): def __init__(self,parent=None): super(Ui,self).__init__(parent) self.setupUi(self) app = QApplication(sys.argv) ui = Ui() ui.show() app.exec_()
运行程序,出现以下界面,和在designer中设计的一致。
下面在对界面中的控件实现功能。
首先是浏览功能。当点击浏览按钮后,会弹出对话框,选择目录,然后程序会自动的搜索目录下的指定格式的博文,并显示在table中。这里,选择目录使用的是easygui模块中的diropenbox函数。这个函数会出现目录选择对话框,返回你选择的目录的绝对路径。
以下是搜寻目录下的指定格式的博文代码seek_file.py:
# -*- coding: utf-8 -*- import sys from easygui import * import os def list_file(directory,leixing): file_list = [] pwd_list = os.listdir(directory) for i in pwd_list: if '.' not in i: # 如果是目录的话 try: now_pwd = directory + '\\' + i #得到目录的绝对路径 l_list= list_file(now_pwd,leixing) #在目录中统计代码行数 if l_list: file_list.extend(l_list) except: pass else: #如果不是目录,对文件进行分析 if leixing in i: file_list.append(i) return file_list def dict_file(directory,leixing): file_dict = {} pwd_list = os.listdir(directory) for i in pwd_list: if '.' not in i: # 如果是目录的话 try: now_pwd = directory + '\\' + i #得到目录的绝对路径 temp_dict= dict_file(now_pwd,leixing) #在目录中统计代码行数 if temp_dict: file_dict.update(temp_dict) except: pass else: #如果不是目录,对文件进行分析 if leixing in i: file_dict[i] = directory return file_dict if __name__ == "__main__": directory = diropenbox('','请选择一个目录',default='G:\\博客文章') #file_list = list_file(directory,'.pdf') file_dict = dict_file(directory,'.pdf') print(file_dict)
程序中实现了两个函数,函数功能都是一样的,从目录下指定类型的文件给找出来,只不过list_file返回的是找到的文件的列表,而dict_file返回的是字典,文件是键,文件目录是键值。
然后是实现tongji的槽函数了。
def tongji(self): directory = diropenbox('','请选择一个目录',default='G:\\博客文章') if self.radioButton.isChecked(): leixing = '.pdf' else: leixing = '.docx' #print(leixing) self.file_dict = dict_file(directory,leixing) self.file_list = list_file(directory,leixing) #print(file_list) number = len(self.file_list) self.lineEdit.setText(directory) self.lineEdit_2.setText(str(number)) self.tableWidget.setRowCount(number) for i in range(number): item = QtGui.QTableWidgetItem() self.tableWidget.setItem(i,0,item) for i in range(number): item = self.tableWidget.item(i,0) item.setText(_translate("Form", self.file_list[i], None)) self.pushButton_2.setEnabled(True)
函数实现也比较简单,调用seek_file.py中的两个函数,得到博文的列表和字典。然后将列表中的数据给写到表格中。同时将博文的总数写到博文总数后面的显示框中。运行效果就是以下截图,发现,至今已经写了106篇博文了。
当选择表格中的博文时,在下面的博文和目录中就会出现选中博文的信息。这个代码通过cellclicked槽函数实现,当选择表格中的博文时,就会触发该槽函数执行。这部分代码也比较简单,先获取点击单元格的内容,得到博文名,然后再通过字典得到博文路径,显示在界面中。
def cellclicked(self,row,col): print(row+1,col+1) item = self.tableWidget.item(row,col) file_name = item.text() try: dic = self.file_dict[file_name] self.lineEdit_3.setText(file_name) self.lineEdit_4.setText(dic) except: print('error')
程序运行,选择表格中的单元格,在下面的显示框中显示对应的数据。
最后一部分就是生成excel。生成excel,在新的py文件中写了一个函数来实现:
import openpyxl def excel_generate(list_file,dict_file,leixing): wb = openpyxl.workbook.Workbook() ws1 = wb.create_sheet(0,title = leixing[1:]) for i in range(1,len(list_file)+1): temp_list = [i,list_file[i-1],dict_file[list_file[i-1]]] ws1.append(temp_list) wb.save(leixing[1:]+'.xlsx') if __name__ == '__main__': file_list =['hello.pdf','aaa.pdf'] dict_file = {file_list[0]: 1, file_list[1]:2} excel_generate(file_list,dict_file,'.pdf')
使用的是操作excel的openpyxl模块,输入参数是文件列表和文件字典以及文件的后缀类型。然后在槽函数的excel_gen中调用该函数即可了,文件列表和文件字典在之前已经获取了,直接传递就可以了。代码就很简单了。
def excel_gen(self): #print('excel gen') excel_generate(self.file_list,self.file_dict,'.pdf')
运行后,在目录下就会出现一个excel。
打开一看,就是统计的博文。
以上就是实现了用python统计自己写的博文了。我会将代码上传,有兴趣的可以看看。