简 介: 利用CSDN提供的博文的列表,编写了一个快速检索自己博文,并自动插入索引连接的程序。这样就可以大大提高博文写作的效率,将之前记录学习、工作的内容更好的进行连接。最后,感谢CSDN技术人员的大力支持和帮助。

关键词博文索引分词引用

#mermaid-svg-NrsLCZojjt6eSTAF {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-NrsLCZojjt6eSTAF .error-icon{fill:#552222;}#mermaid-svg-NrsLCZojjt6eSTAF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-NrsLCZojjt6eSTAF .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-NrsLCZojjt6eSTAF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-NrsLCZojjt6eSTAF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-NrsLCZojjt6eSTAF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-NrsLCZojjt6eSTAF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-NrsLCZojjt6eSTAF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-NrsLCZojjt6eSTAF .marker.cross{stroke:#333333;}#mermaid-svg-NrsLCZojjt6eSTAF svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-NrsLCZojjt6eSTAF .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-NrsLCZojjt6eSTAF .cluster-label text{fill:#333;}#mermaid-svg-NrsLCZojjt6eSTAF .cluster-label span{color:#333;}#mermaid-svg-NrsLCZojjt6eSTAF .label text,#mermaid-svg-NrsLCZojjt6eSTAF span{fill:#333;color:#333;}#mermaid-svg-NrsLCZojjt6eSTAF .node rect,#mermaid-svg-NrsLCZojjt6eSTAF .node circle,#mermaid-svg-NrsLCZojjt6eSTAF .node ellipse,#mermaid-svg-NrsLCZojjt6eSTAF .node polygon,#mermaid-svg-NrsLCZojjt6eSTAF .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-NrsLCZojjt6eSTAF .node .label{text-align:center;}#mermaid-svg-NrsLCZojjt6eSTAF .node.clickable{cursor:pointer;}#mermaid-svg-NrsLCZojjt6eSTAF .arrowheadPath{fill:#333333;}#mermaid-svg-NrsLCZojjt6eSTAF .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-NrsLCZojjt6eSTAF .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-NrsLCZojjt6eSTAF .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-NrsLCZojjt6eSTAF .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-NrsLCZojjt6eSTAF .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-NrsLCZojjt6eSTAF .cluster text{fill:#333;}#mermaid-svg-NrsLCZojjt6eSTAF .cluster span{color:#333;}#mermaid-svg-NrsLCZojjt6eSTAF div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-NrsLCZojjt6eSTAF :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

背景介绍
目 录
Contents
博文清单
读取博文内容
文章检索
博文检索
检索方案
检测测试
信息插入CSDN
总 结
csdm程序

§00 背景介绍

  人生就像一场持续的演出,你在其中既做演员、又当导演。就像李雪琴所说: 做不了情绪的导演,可以做情绪的场记 。认真记录一下自己的思考和体验,可以“在擦干眼泪之后,记住每一次教训”。

▲ 图1 李雪琴:做不了情绪的导演,可以做情绪的场记

  提到场记,在CSDN上记录了很多学习、工作的记录。非常方便,有效。为了能够进一步提高这些场记对于后面的帮助。特地向CSDN索要了一份自己博文的清单列表。这样便可以作为基础便于今后的查询与索引。

我想询问一下,如何能够方便获得我的所有在CSDN上文章的连接。 我在写作博文的时候,非常频繁的需要引用之前博文工作的内容,由于现在我的博文比较多(2460篇左右),通过现在CSDN上的查询比较麻烦,我想是否能够将我的所有博文的名称 以及对应的CSDN上的链接下载下来,我自己编写一个方便使用的Python名称检测,便可以加速我的博文写作过程。

如果现在我通过网络爬虫下来这些信息,还是比较麻烦,因此我想询问是否你们可以帮我将现在所有我之前博文的链接能够生成发送给我,或者有什么方便的接口,我可以调用?

§01 博文清单


  今天(2022-01-18)收到CSDN给我发送过来博文列表,包含了文章名称和访问连接。

D:\Temp\卓晴老师全部文章列表.csv

1.1 读取博文内容

  我得到的博文清单的列表是 CSV 格式。在Windows下,使用EXCEL打开该文件。

1.1.1 Excel文件打开

  但是直接使用Excel打开,看到:

  • 表格包含三列:url,title,status
  • title的中文字符都出现乱码;
    ▲ 图1.1.1 EXCEL打开出现的乱码

  这应该是文件存储时的编码出现问题。

1.1.2 利用Python读取

(1)读取程序

import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *filename = r'D:\Temp\卓晴老师全部文章列表.csv'with open(filename, 'r') as f:for l in f.readlines():print(l)

(2)执行结果

  直接读取出现解码错误。

Traceback (most recent call last):
File "<pyshell#6>", line 2, in <module>
UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 98: illegal multibyte sequence

  根据 关于python内open函数encoding编码问题 提到的经验,在打开文件中增加encoding='utf-8'可以解决这个情况。

import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *filename = r'D:\Temp\卓晴老师全部文章列表.csv'with open(filename, 'r', encoding='utf-8') as f:for l in f.readlines():print(l)

  这样便可以获得正确的输出信息了:

  下面是部分输出的信息。

"https://blog.csdn.net/zhuoqingjoking97298/article/details/122526980","为什么LED内部不集成限流电阻呢?","1""https://blog.csdn.net/zhuoqingjoking97298/article/details/122530436","什么是微分?什么是导数?如何利用微分-导数方程求导数?","1""https://blog.csdn.net/zhuoqingjoking97298/article/details/122531852","numpy中计算矩阵数值的核心函数","1""https://blog.csdn.net/zhuoqingjoking97298/article/details/122535149","第十六届全国大学生智能车竞赛相关照片","1""https://blog.csdn.net/zhuoqingjoking97298/article/details/122537709","清华大学本科生微积分2021年期末考试试卷","1"

  可以得到2616条博文记录信息。

1.1.3 利用numpy读取CSV

  根据python-numpy数组的csv文件写入与读取 介绍的方法,利用NumPy读取CSV文件。

  但是直接读取会存在问题:

Traceback (most recent call last):
File "<pyshell#44>", line 1, in <module>
File "C:\Users\zhuoqing\Anaconda3\lib\site-packages\numpy\lib\npyio.py", line 1112, in loadtxt
UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 98: illegal multibyte sequence

1.1.4 利用csv读写文件

import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *
import csvfilename = r'D:\Python\Cmd\database\csdnlist-2022-1-18.csv'with open(filename, 'r', encoding='utf-8') as f:csv_reader = csv.reader(f, delimiter=',')for count,l in enumerate(csv_reader):print("l: {}\n".format(l))if count >= 10: break
l: ['url', 'title', 'status']
l: ['https://blog.csdn.net/zhuoqingjoking97298/article/details/104064392', '紧急制动', '1']
l: ['https://blog.csdn.net/zhuoqingjoking97298/article/details/104064573', '大脑里的电极', '1']
l: ['https://blog.csdn.net/zhuoqingjoking97298/article/details/104064593', '数码管识别', '1']
l: ['https://blog.csdn.net/zhuoqingjoking97298/article/details/104064723', '劈-I-D', '1']
l: ['https://blog.csdn.net/zhuoqingjoking97298/article/details/104064893', 'CSDN上究竟可以上载多大的GIF文件?', '1']
l: ['https://blog.csdn.net/zhuoqingjoking97298/article/details/104072612', '使用AD8302进行检波', '1']
l: ['https://blog.csdn.net/zhuoqingjoking97298/article/details/104083055', '三极管饱和状态下增益', '1']
l: ['https://blog.csdn.net/zhuoqingjoking97298/article/details/104085992', '减速电机JGA25-370的控制电路', '1']
l: ['https://blog.csdn.net/zhuoqingjoking97298/article/details/104089780', '机械变阻器、电位器', '1']
l: ['https://blog.csdn.net/zhuoqingjoking97298/article/details/104092963', '手持红外温度计AR802B', '1']

  可以看到使用CSV读取csv文件非常方便,它可以自动将读入的数据进行有效的分割。

1.2 文章检索

1.2.1 基础数据文件

  将所得到的文件另外存储到:

filename = r'D:\Python\Cmd\database\csdnlist-2022-1-18.csv'

  读取这个数据文件所需要的时间大约为0.3570秒;

import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *filename = r'D:\Python\Cmd\database\csdnlist-2022-1-18.csv'count = 0starttime = time.time()with open(filename, 'r', encoding='utf-8') as f:for l in f.readlines():count +=1costtime = time.time() - starttime
print("count: {}\n".format(count), "costtime: {}\n".format(costtime))
count: 2616
costtime: 0.35702037811279297

1.2.2 中文分词

  为了提高检索的效率,在传统的字符串匹配上,将所有的文章的title进行中文分词,以提高分词匹配的加权,可以提高匹配的中文理解能力。

  在知乎 中文分词方法和软件工具汇总笔记 中汇总了中文分词的的方法和软件工具。之前我只知道 jieba分词 ,想不到现在可以使用的工具这么多呢。不过还是首先测试一下jieba分词对于所有引文标题的分词效果。

(1)JieBa分词

  下面就按照jieba分词中介绍的方法进行实验。

 Ⅰ.安装JieBa
pip3 install jieba
 Ⅱ.测试分词效果
import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *
import csv
import jiebafilename = r'D:\Python\Cmd\database\csdnlist-2022-1-18.csv'with open(filename, 'r', encoding='utf-8') as f:csv_reader = csv.reader(f, delimiter=',')for count,l in enumerate(csv_reader):seg = '-'.join(jieba.cut(l[1]))print("seg: {}\n".format(seg))if count >= 20: break
seg: title
seg: 紧急制动
seg: 大脑-里-的-电极
seg: 数码管-识别
seg: 劈---I---D
seg: CSDN-上-究竟-可以-上载-多大-的-GIF-文件-?
seg: 使用-AD8302-进行-检波
seg: 三极管-饱和状态-下-增益
seg: 减速-电机-JGA25---370-的-控制电路
seg: 机械-变阻器-、-电位器
seg: 手持-红外-温度计-AR802B
seg: 什么-数字-万用表-可以-测量-噪声-?
seg: 测试-可编程-波形发生器- -AD9833
seg: AD9833-数字信号-发生器-模块
seg: 使用-AD9833-谐波-发送-调频-广播
seg: RDA5807- -FM-收音机-模块
seg: Hands---On- -Learning- -Through- -Racing
seg: 脑残-的-猪尾-汇
seg: 挑战杯-科展-上-的-智能-车-作品
seg: 至-简至-美
seg: 一分钟-制版-法

  虽然看起来上面分词的效果不咋地,但利用这个结果还是可以在一定程度上提高对于博文检索的精确性的。

  关于JieBa的详细使用方法,在简书的博文 jieba分词详解 中给出了详细的介绍。

1.2.3 处理CSV文件

  由于动态调用JieBa分词需要一定时间,因此将原始的CSV文件进行预处理,将所有的标题分词之后进行存储,这样后期处理便可以直接利用分词后的标题进行检索的。

(1)转换文件格式

import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *
import csv
import jiebafilename = r'D:\Python\Cmd\database\csdnlist-2022-1-18.csv'
outfile = r'D:\Python\Cmd\database\csdnlist-2022-1-18-jieba.csv'with open(filename, 'r', encoding='utf-8') as f:csv_reader = csv.reader(f, delimiter=',')with open(outfile, 'w') as outf:out_write = csv.writer(outf, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)for count,l in enumerate(csv_reader):seg = '`'.join(jieba.cut(l[1]))try:out_write.writerow([l[0], seg])except:passprint('Process {} lines'.format(count))

  最终获得2615行处理后的数据。其中有一条在out_write.writerow的过程中出现中文编码错误。最终的结果存储在csdnlilst-2022-1-18-jieba.csv中。

    csdnlist-2022-1-18-jieba.csvcsdnlist-2022-1-18.csv

(2)检查处理结果

  注意,由于上面在生成新的CSV文件的时候,没有使用 encoding='utf-8'编码的方式,所以在下面再打开CSV文件的时候,不需要在使用encoding='utf-8'编码方式了。

import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *
import csv
import jiebafilename = r'D:\Python\Cmd\database\csdnlist-2022-1-18-jieba.csv'with open(filename, 'r') as f:csv_reader = csv.reader(f, delimiter=',')for count,l in enumerate(csv_reader):print("l: {}\n".format(l))if count >= 10: break
l: ['url', 'title']
l: []
l: ['https://blog.csdn.net/zhuoqingjoking97298/article/details/104064392', '紧急制动']
l: []
l: ['https://blog.csdn.net/zhuoqingjoking97298/article/details/104064573', '大脑`里`的`电极']
l: []
l: ['https://blog.csdn.net/zhuoqingjoking97298/article/details/104064593', '数码管`识别']
l: []
l: ['https://blog.csdn.net/zhuoqingjoking97298/article/details/104064723', '劈`-`I`-`D']
l: []
l: ['https://blog.csdn.net/zhuoqingjoking97298/article/details/104064893', 'CSDN`上`究竟`可以`上载`多大`的`GIF`文件`?']

  从上面的测试结果输出的情况来看,在生成的文件中,出现了一半的空行!

  使用EXCEL打开CSV文件,可以查看到在文件中的确每隔一行出现了一个空行,但写入的纵列没有变。

▲ 图1.2.1 使用EXCEL打开CSV文件

  这个问题后面经过初步查找并没有得到具体的解释。不过这不影响之后的应用,对此也就不再进行追查了。

空行问题解决:

小小明-代码实体:csv模块导出的文件产生多余换行的原因是默认输出的换行符是\r\n,只需要修改换行符为\n即可解决更问题,参考:csv.writer(f, lineterminator=’\n’)

§02 博文检索


2.1 检索方案

  编写一个检测Python程序,参数是检索的关键词。可以是多个关键词。通过匹配博文的标题进行打分。对于多个关键词,它们的打分值是累加的。

  对于单个关键词打分的标准:

  • 如果能够完全匹配一个分词:+10分;多个分词则继续累加;
  • 如果能够在一个分词内进行匹配:+5分;多个进行累加;
  • 如果能够在整句话中进行整词的匹配:+3分;多个进行累加;
  • 对于每个字进行匹配:+1分
  • 对于得分相同,在原来序列日期近的靠近,所以按照原来的顺序id, 增加一个小数: id/10000.0

  为了突出关键词重要性,如果一个关键词后面携带句号(’.’,’。’)这个关键得分乘以10。

2.1.1 检索算法

from headm import *                 # =
import csvcsdnlist = r'D:\Python\Cmd\database\csdnlist-2022-1-18-jieba.csv'if len(sys.argv) == 1:printf("cdtm key[s]\a")exit()def matchScore(line):score = 0lsect = line.split('`')lstr = line.replace('`', '')for k in sys.argv[1:]:keyscore = 0ktime = 1if k.count('.') > 0:ktime = 10 * k.count('.')k = k.replace('.', '')if k.count('。') > 0:ktime = 10 * k.count('。')k = k.replace('。', '')for s in lsect:if s == k:              keyscore += 10elif s.find(k) >= 0:    keyscore += 5if keyscore == 0:if lstr.find(k) >= 0:  keyscore += 3else:for c in k:if lstr.find(c) >= 0: keyscore += 1score += keyscore * ktimereturn scoreurldim = []
titledim = []
urlscore = []with open(csdnlist, 'r') as f:csvr = csv.reader(f, delimiter=',')for count,l in enumerate(csvr):if count == 0: continue     # First row of csv is title rowif len(l) == 0: continue    # Empty rowurldim.append(l[0])titledim.append(l[1].replace('`', ''))urlscore.append(matchScore(l[1])+count/10000.0)alldim = [(s,u,t) for s,u,t in zip(urlscore, urldim, titledim)]alldim = sorted(alldim, key=lambda x:x[0], reverse=True)for i in range(20):printt(alldim[i][0], alldim[i][2])

2.2 检测测试

  下面给出一些基本检测测试结果,看是否与检索意图能够相互匹配。

  • 规则

    10.5068 第十七届全国大学生智能车竞赛智能视觉组规则补充说明(1)
    10.4046 第十六届全国大学生智能汽车竞赛 讯飞智慧餐厅 全国总决赛竞赛规则
    10.4002 关于第十六届全国大学生智能汽车竞赛总决赛的规则建议
    10.3882 第十六 届全国大学生智能汽车竞赛 讯飞创意组 全国 选拔赛 竞赛规则
    10.388 讯飞智慧餐厅关于规则与赛程的通知
    10.2872 全国大学生智能汽车竞赛-讯飞赛道规则解读
    10.1828 关于2020年第十五届全国大学生智能汽车竞赛山东赛区技术答辩的相关规则
    10.1682 聚沙成塔 : 第十六届智能车竞赛规则你一言,我一语
    10.1074 电子硬件黑客规则
    10.094 STC单片机的命名规则
    10.0852 第十四届智能车竞赛规则浅聊
    10.0608 第十五届全国大学生智能汽车竞赛竞速赛规则(讨论稿)
    10.042 第十四届智能车竞赛规则浅聊
    10.0414 竞赛规则补充说明 | 无线节能组车模
    5.4928 第十七届全国大学生智能汽车竞赛创意组-百度智慧交通 “丝绸之路”比赛规则
    5.4682 第十七届智能车竞赛竞速比赛规则修订文档-一览表
    5.464 第十七届全国大学智能汽车竞赛竞速比赛规则
    5.2346 第十六届全国大学智能汽车竞赛竞速比赛规则
    5.0412 轻磅消息 | 室外光电竞速创意比赛规则
    1.5142 一个中等规模的七段数码数据库以及利用它训练的识别网络

  • STC

    10.4764 有STC制作一个手持微型示波器
    10.475999999999999 第十七届全国大学智能车竞赛STC芯片申请方法
    10.3348 直播预告 | STC单车拉力组专题培训
    10.2364 普大喜奔:智能车竞赛STC 16位、8位单片机免费样品申请开始啦!
    10.1864 STC单片机功率控制下载板
    10.1086 STC单片机高速下载电路改进
    10.1038 制作新版STC单片机WiFi下载器
    10.1014 通过WiFi对STC单片机程序下载和调试
    10.0992 STC自动高速下载线
    10.0954 STC单片机自动下载调试器设计
    10.094 STC单片机的命名规则
    10.0938 测试几款STC下载电路
    10.0936 全自动STC下载电路设计
    10.0932 STC单片机下载实验
    10.087 关于第十五届全国大学生智能车竞赛 STC 单片机
    5.1924 基于STC8H1K28的人机键盘界面
    5.175 双轴机械臂位置闭环控制:STC8H1K28,42HS48EIS,BH32
    5.1604 双轴机械臂调试:步进电机42HS348E,BH32角度传感器,MCU:STC8H1K28
    5.1596 基于STC8H1K28的双轴机械臂驱动模块:步进电机42HS348E,BH32角度传感器
    5.1526 设计基于MAX1240,MAX5353的ADDC模块STC8G1KSOP8

2.3 信息插入CSDN

  下面,将上面的检索程序补充完全,也就是将检索的信息直接添加CSDN的Markdown的编辑器。如果在查询之前CSDN有选择文字,则使用改文字作为插入的TITLE。

  在下面针对以下名词进行检索:十七届竞赛通知电灯单片机人工智能微积分信号与系统

※ 总  结 ※


  利用CSDN提供的博文的列表,编写了一个快速检索自己博文,并自动插入索引连接的程序。这样就可以大大提高博文写作的效率,将之前记录学习、工作的内容更好的进行连接。

  最后,感谢CSDN技术人员的大力支持和帮助。

3.1 csdm程序

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# CDTM.PY                      -- by Dr. ZhuoQing 2022-01-18
#   cdtm keys >title                #
#        keys :title                #
#        keys :title.               # only copy the url to clipboard
#        keys :title;               # Open URL on chrome
#        backup                     # backup the
#        ?                         # Display last frame
# Note:
#============================================================from headm import *                 # =
import csvcsdn_title = '写文章-CSDN博客'
csdnlist = r'D:\Python\Cmd\database\csdnlist-2022-1-18-jieba.csv'
backupdir = r'D:\Nutdisk\Temp'#------------------------------------------------------------
rect = tspgetwindowrect("HELP")
linenum = int((rect[3]-rect[1]-20)//rect[4]*0.7-3)*4//5
#------------------------------------------------------------inserttitle = ''
keydim = []
urlflag = 0
openflag = 0
searchandflag = 0#------------------------------------------------------------
if len(sys.argv) > 1:if sys.argv[1] == 'backup':outfile = os.path.join(backupdir, os.path.basename(csdnlist))printf(outfile)import shutilshutil.copyfile(csdnlist, outfile)printf('\a')exit()elif sys.argv[1] in '??.':with open(csdnlist, 'r') as f:csvr = csv.reader(f, delimiter=',')titledim = []for count,l in enumerate(csvr):if count == 0: continue     # First row of csv is title rowif len(l) < 2: continue    # Empty rowif len(l[0]) == 0: continueif len(l[1]) == 0: continuetitledim.append(l[1])printf('Total Record:%d'%len(titledim))for i in range(linenum+3):s = titledim[-i-1]printf("%02d: %s"%(i+1, s.replace('`', '')))printf("\a")exit()#------------------------------------------------------------
if len(sys.argv) == 1:urlstr = clipboard.paste()if urlstr.find('http') < 0:titlestr = urlstrurlstr = tspread()[-1]else:titlestr = tspread()[-1]if urlstr.find('http') >= 0 and len(titlestr) > 0:with open(csdnlist, 'r') as f:csvr = csv.reader(f, delimiter=',')titledim = []urldim = []for count,l in enumerate(csvr):if count == 0: continue     # First row of csv is title rowif len(l) < 2: continue    # Empty rowif len(l[0]) == 0: continueif len(l[1]) == 0: continuetitledim.append(l[1].replace('`',''))urldim.append(l[0])if urlstr in urldim and titlestr in titledim:printf("URL has already been added into record files.\a")for i in range(linenum):printf("%02d: %s"%(i+1, titledim[-i-1]))else:import jiebaseg = '`'.join(jieba.cut(titlestr))with open(csdnlist, 'a') as f:insertstr = '"%s","%s"\n'%(urlstr, seg)f.write(insertstr)printf("\r\nAdd record: \r\n    %s\r\n    %s\r\n\a"%(titlestr, urlstr))for i in range(linenum):printf("%02d: %s"%(i+1, titledim[-i-1]))clipboard.copy('')exit()#------------------------------------------------------------
for s in sys.argv[1:]:if s[0] in ':>|:':inserttitle = s[1:]if s[0] == '>':urlflag = 1else:if s[-1] in ':>|:':s = s[:-1]searchandflag = 1if len(s) > 0:keydim.append(s)#------------------------------------------------------------
if len(inserttitle) == 0:clipboard.copy('')tspsendwindowkey(csdn_title, "c", control=1, noreturn=1)time.sleep(.1)inserttitle = clipboard.paste()if len(inserttitle) > 0:keydim.append(inserttitle)#------------------------------------------------------------
if len(keydim) == 0:printf("cdtm key[s]\a")exit()#------------------------------------------------------------
def matchScore(line, count=0):global keydim#--------------------------------------------------------score = 0lsect = line.split('`')lstr = line.replace('`', '')#--------------------------------------------------------for k in keydim:keyscore = 0ktime = 1if k.count('.') > 0:ktime = 10 * k.count('.')k = k.replace('.', '')if k.count('。') > 0:ktime = 10 * k.count('。')k = k.replace('。', '')#----------------------------------------------------for s in lsect:if s.upper() == k.upper():              keyscore += 10elif s.upper().find(k.upper()) >= 0:    keyscore += 5if keyscore == 0:if lstr.upper().find(k.upper()) >= 0:  keyscore += 3else:for c in k:if lstr.find(c) >= 0: keyscore += 1if searchandflag > 0:if keyscore == 0: return 0score += keyscore * ktimereturn score + count/10000.0#------------------------------------------------------------
alldim = []#------------------------------------------------------------
def searchTitle():
#    global urldim,titledim,urlscoreglobal alldimurldim = []titledim = []urlscore = []with open(csdnlist, 'r') as f:csvr = csv.reader(f, delimiter=',')for count,l in enumerate(csvr):if count == 0: continue     # First row of csv is title rowif len(l) < 2: continue    # Empty rowurldim.append(l[0])titledim.append(l[1].replace('`', ''))urlscore.append(matchScore(l[1], count))alldim = [(s,u,t,n) for s,u,t,n in zip(urlscore, urldim, titledim, list(range(len(urlscore))))]alldim = sorted(alldim, key=lambda x:x[0], reverse=True)score = array([a[0] for a in alldim])return (score > 1.0).tolist().count(True)#------------------------------------------------------------
searchnum = searchTitle()#------------------------------------------------------------
selectid = -1
frame = 0
numstr = '1234567890!@#$%^&*()abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
#numstr = '1234567890!@#$%^&*()abcdefghijklmnopqrstuvwxyz'
frame_length = len(numstr)
copyflag = 0if frame_length > linenum: frame_length = linenumtspfocuswindow('TEASOFT:1')#------------------------------------------------------------while True:startid = frameendid = startid + frame_lengthif startid < 0: startid = 0if endid < 0:   endid = 0if startid >= len(alldim):  startid = len(alldim)if endid >= len(alldim):    endid = len(alldim)if endid == startid: breakif searchandflag == 0:searchstr = '|'.join(keydim)else:searchstr = '&'.join(keydim)hint = '[%02d-%02d](%d):%s\r\n--------------------------------\r\n'%(startid, endid, searchnum, searchstr)for i in range(startid, endid):id = i - startidif id >= searchnum: breakidstr = numstr[id]lines = '%s: %s(%.3f/%d)\r\n'%(idstr, alldim[i][2], alldim[i][0], len(alldim)-alldim[i][3]+1)hint = hint + linesprintf('')printf(hint)key = tspinput("Input Number and string:")#--------------------------------------------------------if key == '\r':frame += len(numstr)if frame + frame_length >= searchnum:frame = searchnum - frame_lengthif frame < 0:frame = 0continueif len(key.replace(' ','').replace('\r','')) == 0:spacenum = key.count(' ')if spacenum > 0:frame -= spacenum * frame_lengthif frame < 0: frame = 0continue#--------------------------------------------------------if key == 'ESC':breakkey = key.strip('\r')if key[-1] in '.。':key = key[:-1]copyflag = 1if key[-1] in ';;':key = key[:-1]openflag = 1if key[-1] in ',,':key = key[:-1]if len(key)== 1:num = numstr.find(key[0])if num >= 0:selectid = frame + numchrome_path = r'C:/Program Files (x86)/Google/Chrome/Application/chrome.exe %s'import webbrowserwebbrowser.get(chrome_path).open_new(alldim[selectid][1])printf("Chrom open:%s"%alldim[selectid][1])continue#--------------------------------------------------------id = key.find(':')if id < 0:id = key.find(':')if id >= 0:inserttitle = key[id+1:]key = key[:id]num = -1if len(key)== 1:num = numstr.find(key[0])if num >= 0:selectid = frame + numbreakelse:ssdim = [ss.strip('\r') for ss in key.split(' ') if len(ss) > 0]searchandflag = 0ss = keyif ss.find('&') >= 0 or ss.find(':') >= 0 or \ss.find('|') >= 0 or ss.find('>') >= 0 or \ss.find(':') >= 0 or ss.find('\\') >= 0 or\ss.find('、') >= 0 or ss.find('/') >= 0:passelse:keydim = []for s in ssdim:if s[-1] in '&:|>:\\、/':if s[-1] == '&':searchandflag = 1s = s[:-1]elif s[0] in '&:|>:、\\/':if s[0] == '&':searchandflag = 1s = s[1:]if len(s) > 0: keydim.append(s)rect = tspgetwindowrect("HELP")linenum = int((rect[3]-rect[1]-20)//rect[4]*0.7-3)*4//5searchnum = searchTitle()frame = 0#printf(selectid, copyflag)
#------------------------------------------------------------
if selectid >= 0:insertstr = ''if len(inserttitle) == 0:if urlflag == 0:inserttitle = alldim[selectid][2]insertstr = '[**%s**](%s)'%(inserttitle, alldim[selectid][1])else: insertstr = '<%s>'%alldim[selectid][1]else:insertstr = '[**%s**](%s)'%(inserttitle, alldim[selectid][1])if urlflag > 0:insertstr = insertstr + '<%s>'%alldim[selectid][1]if copyflag == 0 and openflag == 0:if len(insertstr) > 0:clipboard.copy(insertstr)time.sleep(.05)tspsendwindowkey(csdn_title, "v", control=1,noreturn=1)elif openflag == 1:chrome_path = r'C:/Program Files (x86)/Google/Chrome/Application/chrome.exe %s'import webbrowserwebbrowser.get(chrome_path).open_new(alldim[selectid][1])printf("Chrom open:%s"%alldim[selectid][1])else:clipboard.copy(alldim[selectid][1])printf("Clipobard:%s"%alldim[selectid][1])else:tspfocuswindow('TEASOFT:1')#printf('\a')
#------------------------------------------------------------
#        END OF FILE : CDTM.PY
#============================================================

■ 相关文献链接:

  • 做不了情绪的导演,可以做情绪的场记
  • CSV
  • 关于python内open函数encoding编码问题
  • python-numpy数组的csv文件写入与读取
  • 中文分词方法和软件工具汇总笔记
  • jieba分词详解
  • 十七届竞赛通知
  • 电灯
  • 单片机
  • 人工智能
  • 微积分
  • 信号与系统

● 相关图表链接:

  • 图1 李雪琴:做不了情绪的导演,可以做情绪的场记
  • 图1.1.1 EXCEL打开出现的乱码
  • 图1.2.1 使用EXCEL打开CSV文件

快速检索并引用你在CSDN上所有的博文笔记相关推荐

  1. 【粉丝福利,限时免费】【千里之行,始于脚下】我在CSDN上的精品博文汇总,收藏起来慢慢看

    文章目录 1 写在前面 2 精品博文汇总 3 更多分享 1 写在前面 就在上周,我在CSDN的原创博文数量正式突破 100+,顺利拿下 CSDN博客专家的称号,前前后后耗时有4-5年吧,不过中间有两年 ...

  2. 如何在CSDN上快速引用到网页内的局部位置?

    简 介: 利用网页内的跳转,可以使得博文中的引用更加的精确.可以在点击跳转之后能够精确定位在引用网页中的位置.这需要能够准确获得所在网页内的"锚定字符串".本文总结了CSDN,Gi ...

  3. 在csdn上如何快速转载博客

    在CSDN上如何快速转载博客 小黄花的故事 2017-08-10 20:29:35 1194 收藏 1 最后发布:2017-08-10 20:29:35首发:2017-08-10 20:29:35 分 ...

  4. 简单快速复制CSDN上的博客到自己的电脑上(带图片和格式)

    准备工具: typora (md编辑器)直接去官网https://www.typora.io/下载,一直点下一步. 下载好了后界面是这样的,清爽且好用. 需要做一点设置 [文件 - 偏好设置-图像], ...

  5. 国赛latex方法快速检索(入门级)

    latex方法快速检索 本文主要为国赛论文书写服务,利用的是Github上cumcmthesis论文模板 本文部分节选自:https://zhuanlan.zhihu.com/p/456055339? ...

  6. 技术图文:如何在CSDN上写自己的技术Blog?

    背景 下周一很多高校就要开学了,由于疫情的影响教育部提出"停课不停学"的口号.我也想着把组队学习应用于本次的远程线上教学中,通过让学生们写技术blog的方式来检查TA们对知识点的掌 ...

  7. Elasticsearch 如何做到快速检索 - 倒排索引的秘密

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:https://ricstudio.top/archives/es-lucene-reverted-index 一.前言 最近 ...

  8. Elasticsearch 为什么能做到快速检索?— 倒排索引的秘密

    来源:https://ricstudio.top/archives/es-lucene-reverted-index "All problems in computer science ca ...

  9. Elasticsearch 如何做到快速检索?

    " 最近接触的几个项目都使用到了 Elasticsearch (以下简称 ES ) 来存储数据和对数据进行搜索分析,就对 ES 进行了一些学习.本文整理自我自己的一次技术分享. 本文不会关注 ...

最新文章

  1. np.vstack()和np.hstack()
  2. 四、HTTP响应报文格式
  3. MySqlClient访问tinyint字段返回布尔值
  4. 荧光共定位定量分析,单通道散点图剖析
  5. pmp每日三题(2022年2月22日)
  6. ANT 运行jar包的中文乱码问题
  7. 一步步编写操作系统3 部署工作环境 3
  8. php开发中常用函数总结,PHP开发中常用函数总结
  9. Newton迭代法求无约束目标函数极小值matlab实现
  10. linux怎样删除链接文件,在 Linux 中怎样移除(删除)符号链接
  11. sparksql 与flinksql 建表 与 连表记录
  12. ipv4.method
  13. java实现微信订阅消息(服务通知)
  14. 生成对抗网络理论模型和应用综述
  15. python tokenize()_tokenize (Language) – Python 中文开发手册 - Break易站
  16. PLETL的主谓宾 定状补模式 命令 已经设计更新并执行成功如图 中节点 的m_ID 输出已经出现 ,已经开源
  17. 线性代数1.3行列式的按行展开
  18. 写一款汽车维修保养软件,让维修保养管理更加轻松,JavaScript 作用域
  19. 【JSON解析】JSON解析
  20. Unity3D_(游戏)甜品消消乐01_游戏基础界面

热门文章

  1. javascript之判断专题
  2. Windows Server 2012 R2 WSUS-13:部署二级WSUS
  3. win2008win7设置自动登录系统的方法(三步搞定)
  4. RHEL 6上KVM的安装配置及使用-将物理接口桥接到桥接器
  5. 软件工程概论 课后作业1
  6. Python3.5模块‘OS’‘sys’
  7. python property内建函数的介绍
  8. [SQL Server优化]善用系统监视器,确定系统瓶颈
  9. Exchange 混合部署—Exchange 20132007配置
  10. php获取excel时间,详细介绍PHPExcel读取Excel时间的示例代码