weiqi7777

使用python统计博客文章

0
阅读(1392) 评论(0)
统计博文.zip

 

     目前我写博客都是用word写完后,再使用live writer上传到网站上。同时还会将博客保存成pdf。今天突然想到想统计一下目前写的博客文章。最简单的方法就是去博客的各个目录去看一下有多少,然后统计到excel中。但是作为程序员的我们,怎么可能用这么笨的方法,这不,用python来解决。

     首先,先用designer设计界面,并连接信号与槽。文章只有pdfword格式,所有只有两个选项。红色框,就是上一篇博客写的tableWidget控件。

clip_image002

      将界面的ui文件转换为py文件。在py文件中,先定义槽函数,不然运行会报错。这里,先不实现函数的内容。等后面在实现。

def tongji(self):
    pass
 

def cellclicked(self,row,col):
    pass
 

def excel_gen(self):
    pass

    编写mainpy,这个文件代码就是例化上面实现的界面类。

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中设计的一致。

clip_image004

     下面在对界面中的控件实现功能。

      首先是浏览功能。当点击浏览按钮后,会弹出对话框,选择目录,然后程序会自动的搜索目录下的指定格式的博文,并显示在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篇博文了。

clip_image006

当选择表格中的博文时,在下面的博文和目录中就会出现选中博文的信息。这个代码通过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')

程序运行,选择表格中的单元格,在下面的显示框中显示对应的数据。

clip_image008

最后一部分就是生成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')

使用的是操作excelopenpyxl模块,输入参数是文件列表和文件字典以及文件的后缀类型。然后在槽函数的excel_gen中调用该函数即可了,文件列表和文件字典在之前已经获取了,直接传递就可以了。代码就很简单了。

def excel_gen(self):
    #print('excel gen')
    excel_generate(self.file_list,self.file_dict,'.pdf')

运行后,在目录下就会出现一个excel

clip_image010

打开一看,就是统计的博文。

clip_image012

以上就是实现了用python统计自己写的博文了。我会将代码上传,有兴趣的可以看看。