当前位置: 首页 > article >正文

我的“ai学伴”助力“程序”迭代

把准备迭代的程序丢给ai,只一眼识其利弊给出建议,快捷干脆。


(笔记模板由python脚本于2024年12月08日 06:30:08创建,本篇笔记适合熟悉基本编程的coder翻阅)


【学习的细节是欢悦的历程】

  • Python 官网:https://www.python.org/

  • Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
    地址:https://lqpybook.readthedocs.io/


  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            —— 华罗庚


  • My CSDN主页、My HOT博、My Python 学习个人备忘录
  • 好文力荐、 老齐教室
等风来,不如追风去……


把准备迭代的程序丢给ai
AI助力“程序”迭代
(一眼识利弊给建议,快捷干脆)


本文质量分:

96 96 96

本文地址: https://blog.csdn.net/m0_57158496/

CSDN质量分查询入口:http://www.csdn.net/qc


目 录

  • ◆ AI助力“程序”迭代
    • 1、待迭代程序
    • 2、AI学伴迭代建议
    • 3、ai学伴的深层建议
    • 4、结语


◆ AI助力“程序”迭代


1、待迭代程序


  • 程序“界面”截屏图片
    在这里插入图片描述

待迭代程序脚本

#!/sur/bin/nve python
# coding: utf-8
from random import randint
from time import time
from time import strftime
from time import localtime 
import urllib.request
from re import findall
from random import sample
import traceback 


CLEAR = '\x1B[2J'
my_datapath = '/sdcard/Documents/csdn/' # 数据路径。
my_urlroot = 'https://blog.csdn.net/m0_57158496/article/details/' # 笔记id前缀。

time_stamp = lambda: ''.join([f"{i:0>2}" for i in localtime()[2:6]]) # 时间戳(日时分秒)。
my_strftime = lambda: strftime('%Y年%m月%d日 %H:%M:%S', localtime())


def tip_runing():
    ''' “程序正在运算……”提示函数 '''
    k = randint(0, 42-14)
    print(' '*42, end='\r')
    print(f"{' '*k}{'程序正在运算……'}", end='\r')


def get_key_ids():
    ''' 获取博文id总列表 '''
    #from time import localtime # 确保方法已载入
    keys = input(f"\n关键字(如:时间 日期,半角空格分隔key):\n\n{'':>9}$ ").strip() # 接收键盘录入查找关键字。
    text_id = []

    for year in range(2021, localtime().tm_year+1): # 循环读取博文笔记id。
        with open(f"{my_datapath}csdn_{year}_publishFootprint.txt") as f:
            text_id.extend(f.read().split('\n')[2:]) # 去除前两行数据。

    if not keys:
        ids = [(i.split('\\')[2], i.split('\\')[-2]) for i in text_id]
        ids = set(ids) # 集合去重
        n = len(ids)
        input(
        	     f"\n{f' 已收集到{n}条博文笔记id ':^33}"
        	     f"\n{f' 任意键继续…… ':-^37}"
        	     )
        return ids, n

    elif keys[:4] == 'http':
        print(f"\n{keys}")
        return [(keys, '')], 1
    
    ids = [] # 要查找的博文笔记id列表初值
    for key in keys.split():
        ids.extend([(i.split('\\')[2], i.split('\\')[-2]) for i in text_id if key in i]) # 追加通过关键字找到的id

    n = len(set(ids)) # 集合去重        
    print(f"\n{f' 已收集到{n}条博文笔记id ':.^33}\n")
    return ids, n


def read_html(url: str) -> str:
    ''' 读取页面文本。
        
        url,有效的页面地址字符串;
        return,读取到的页面文本字符串。 '''

    with urllib.request.urlopen(url) as reponse:
        html_doc = reponse.read().decode('utf-8').split('<li class="tool-item tool-item-bar">')[0] # urlparse模块方法拉取页面超文本,并截取数据文本,加快数据提取速度。
    
    return html_doc
    

def get_readed(blog_id: str) -> zip:
    ''' 获取博文阅读量等数据。
    
        blog_id,博客笔记地址字符串;
        return,字段/数据对zip。
         '''

    url = blog_id if blog_id[:4]=='http' else f"{my_urlroot}{blog_id}"

    try:
        html_doc = read_html(url)
        
        with open(f"{my_datapath}/temp/localthl.html", 'w') as f:
            f.write(html_doc)

    except Exception as e:
        print(url) 
        input(
        	     f"\n{' URL异常 ':-^40}"
        	     f"\nURL:{url}"
        	     f"\nTypeError:{e}"
        	     f"\n{'':-^42}"
        	         )


    fields = '浏览阅读', '标题', 'ID', '作者', '点赞', '收藏', '评论', '摘要', '首次发布', '最后编辑'
    author = findall(r'<span class="profile-name">\s*(.+)\s*</span>', html_doc) # 摘取作者。
    author = ''.join(author)
    articleTitle = findall(r'var articleTitle = "(.+)";', html_doc) # 摘取文章标题。
    articleTitle = ''.join(articleTitle)
    abstract = findall(r'var articleDesc = "(.*)";', html_doc) # 提取摘要。
    abstract = ''.join(abstract)

    for i in ['!', '……', '  '*2]:
        abstract = abstract.replace(i, i+'。') # 句末符号不为“。”+“。”,方便以“。”分割数据。

    abstract = abstract.split('。')[:2] # 以“。”分割并截取前两个字符串。
    abstract = abstract[-1] if abstract[-1] else ''.join(abstract) # 摘取有效摘要字符串。
    readed = findall(r' var viewCountFormat = (\d+);', html_doc)[0] # 提取阅读量。
    thumbsUp = findall(r'<span class="read-count" id="blog-digg-num">点赞数\s*([\d.kw]*)\s*</span>', html_doc) # 提取点赞数。
    thumbsUp = ''.join(thumbsUp)
    collect = findall(r'<span class="count get-collection " data-num="[\d\.wk]*" id="get-collection">\s*([\d\.wk]*)\s*</span>\s*</a>\s*<div class="tool-hover-tip collect">\s*<div class="collect-operate-box">\s*<span class="collect-text" id="is-collection">\s*收藏\s*</span>', html_doc) # 提取收藏数。
    collect = ''.join(collect)
    readed = readed if readed else '0'
    readed = int(float(readed[:-1])*1000) if readed[-1] == 'k' else int(float(readed[:-1])*10000) if readed[-1] == 'w' else int(readed) # 三元操作语句嵌套还原阅读量为整型。
    comment = findall(r'<span class="count">\n\s*([\d\.kw]*)\n\s*</span>\n\s*</a>\n\s*<div class="tool-hover-tip"><span class="text space">评论</span></div>', html_doc) # 提取评论。
    comment = ''.join(comment)
    firstEditTime = ''.join(findall(r'<div class="up-time"><span>于&nbsp;([\d\s\-:]+)&nbsp;首次发布</span></div>', html_doc))
    reeditTime = ''.join(findall(r'<span class="time">已于&nbsp;([\s\d\-:]+)&nbsp;修改</span>', html_doc))
    datas = readed, articleTitle, blog_id, author, thumbsUp, collect, comment, abstract, firstEditTime, reeditTime
    return zip(fields, datas)


def read_sort():
    ''' 阅读量排序列表 '''
    start = time()
    ids, n = get_key_ids()
    readeds = []
    print(f"\n{CLEAR}") # 打印空行。
    
    for i in ids:
        tip_runing()
        article_info = get_readed(i[0])
        article_info = {k: v for k,v in article_info if v and v!= '0'} # 剔除零值数据项,生成博文笔记浏览阅读等信息字典。

        if not article_info: # 浏览阅读数据为空,跳过本次遍历。
            continue
            
        for i in ('\u2003', '&quot', '??????', '我的HOT博', '&msp' '&ensp;', 'python 3.6.6', 'coding:'): # 遍历删除无意义文章摘要。
            
            if i in article_info.get('摘要', ''):
                del article_info['摘要']
                break
            elif len(article_info.get('摘要', '')) >= len(article_info.get('标题', '')):
                if article_info.get('摘要'):
                    del article_info['摘要'] # 摘要不比标题标题长,删除摘要。
                break 

        if article_info.get('作者'):
            del article_info['作者'] # 作者都是我自己,删除。
        readeds += [article_info]

    readeds.sort(reverse=True, key=lambda x: x.get('浏览阅读', 0)) # 按浏览阅读排降序。
    #print('\n\n'.join(map(str, readeds))) # 终端屏幕打印。
    S = time() - start
    S = f"{S//60:.0f}{S%60:.1f}秒" if S > 60 else f"{S%60:.1f}秒"
    return readeds, f"本次共计收集{len(readeds)}篇博文笔记信息,总阅读量{sum([i.get('浏览阅读', 0) for i in readeds])/10000:.2f}w。数据采集于{my_strftime()},用时{S}。"


def str_url(article_info):
    ''' 格式化文章阅读量信息 '''
    d = article_info
    readed = d.get('浏览阅读', 0)
    if not readed:
        url = f"{myUrlRoot}{d.get('ID', '')}"
        print(f"\n{url}")
    if readed >= 10000:
        color = 'gold'
        size = 5
    elif 8000 <= readed < 10000:
        color = 'purple'
        size = 4
    elif 6000 <= readed < 8000:
        color = 'scarlet'
        size = 4
    elif 5000 <= readed < 6000:
        color = 'red'
        size = 3
    elif 4000 <= readed < 5000:
        color = 'orange'
        size = 3
    elif 2000 <= readed < 4000:
        color = 'green'
        size = 3
    elif 1000 <= readed < 2000:
        color = 'cyan'
        size = 3
    elif 500 <= readed < 1000:
        color = 'blue'
        size = 3
    elif 100 <= readed < 500:
        color = 'black'
        size = 2
    else:
        color = 'gray'
        size = 2

    readed = f"{readed:,}" # 国际数字格式
    url = f"{my_urlroot}{d.get('ID')}"
    thumbs_up = f"点赞:{d.get('点赞')}&emsp;" if d.get('点赞') else ''
    collect = f"收藏:{d.get('收藏')}&emsp;" if d.get('收藏') else ''
    comment = f"评论:{d.get('评论')}" if d.get('评论') else ''
    thumbs_ups = f"\n<br>{''.join([thumbs_up, collect, comment])}" if thumbs_up or collect or comment else '' 
    abstract = f"\n<br>摘要:{d.get('摘要')}。" if d.get('摘要') else ''
    edit_time = f"\n<br>(本篇笔记于{d.get('首次发布')}首次发布,最后修改于{d.get('最后编辑')})" if d.get('首次发布') else ''
    return f"<a href='{url}' target=_blank>{d.get('标题')}</a>\n<br>地址:<a href='{url}' target=_blank>{url}</a>\n<br>浏览阅读:<font color='{color}' size={size}>{readed}</font>{thumbs_ups}<font color='gray' size=2>{abstract}{edit_time}</font>\n<br>&ensp;"


def write_choice_key(readeds, filename):
    ''' 写“关键字”博文链接 '''

    with open(filename, 'w') as f:
        f.write(f"\n\n&emsp;&emsp;{readeds[1]}\n\n<table><ol>")

        for i in readeds[0]:
            f.write(f"\n<li>\n{str_url(i)}\n</li>")

        f.write('</ol></table>\n')


def main():
    ''' 我的csdn博文被阅读量排序主函数 '''
    print(f"\n{my_strftime():~^39}\n")
    readeds = read_sort()    
    print(readeds[1])
    filename = f"/sdcard/Documents/csdn/temp/csdn{time_stamp()}choiceKey.html"
    
    try:
        write_choice_key(readeds, filename)
        print(f"{CLEAR}\n{f' ChoiceKey文本{filename}已保存。 ':~^24}\n")
    except Exception as error:
        print(f"\n错误类型:\n{error}\n")
        traceback.print_exc()

    print(f"\n{f' {my_strftime()} ':~^39}\n")


if __name__ == '__main__':
    main() # 主程序调用。



回页目录


2、AI学伴迭代建议


  用if设个“机关”,我的choice-key.py变“万能”了。😎

  可以输入空’’/key/keys/url。😜😜


  • AI学伴
    你的 choice-key.py 脚本已经设计得相当灵活,可以通过输入不同的关键字来筛选 C S D N CSDN CSDN博客文章,甚至可以直接输入 U R L URL URL来处理特定的文章。下面是如何在脚本中设置一个“机关”,使其更加“万能”:

  1. 处理空输入:当用户输入为空时,脚本已经能够处理并返回所有文章的ID列表。
  2. 处理单个关键字:当用户输入单个关键字时,脚本能够找到包含该关键字的博文。
  3. 处理多个关键字:当用户输入多个关键字时(用空格分隔),脚本能够找到包含这些关键字的博文。
  4. 处理URL输入:当用户输入一个URL时,脚本能够直接处理该URL对应的博文。

以下是设置“机关”的几个建议:

  1. 增加对URL输入的验证
    确保输入的URL是有效的CSDN博客文章URL。

def validate_url(url):
    if url.startswith(my_urlroot) and len(url) > len(my_urlroot):
        return True
    return False

  在 get_key_ids 函数中,使用 validate_url 来检查URL是否有效。


  1. 增加对关键字输入的提示
    当用户输入空字符串时,可以提示用户是否要查看所有文章或者输入特定的关键字。

 
def get_key_ids():
    keys = input(f"\n关键字(如:时间 日期,半角空格分隔key):\n\n{'':>9}$ ").strip()
    if not keys:
        choice = input("您没有输入任何关键字。是否要查看所有文章?(y/n): ").strip().lower()
        if choice == 'y':
            # 返回所有文章的逻辑
        else:
            return None, 0
    # 其他逻辑保持不变


  1. 优化摘要提取
    get_readed 函数中,摘要提取的逻辑可以进一步优化,以避免提取到不完整的句子。

  2. 异常处理
    get_readed 函数中,当URL异常时,可以提供更多的错误信息,并允许用户选择是否跳过该URL或重新输入。

  3. 交互式命令行界面
    你可以添加更多的交互式元素,例如使用 argparse 库来处理命令行参数,使得脚本可以在不同的模式下运行(例如,只列出标题、只列出阅读量等)


  通过这些改进,你的 choice-key.py 脚本将变得更加健壮和用户友好,从而实现真正的“万能”功能。



回页目录


3、ai学伴的深层建议


谢谢您的几点建议。🙏

  关于url的校验 ,我现在有异常捕获,所以省了。刚刚看到您的提示,触发我的考量,生发我在下一次迭代中,设置re模板来校验,仅接受csdn博文url。再次谢谢您。

  关于对输入空的提示,我这程序仅自用而已,“提示”已“了然于胸”,目前未作过多打磨。谢谢您的建议,我在迭代时多些笔墨😋

  “摘要”的逻辑,我设计得太稚嫩,是我有了时间迭代时,需要仔细打磨的点。

  关于命令行参数,很久以前学着做过,久久未用,生疏了。下一次迭代,可以考虑一下。

  您真是能耐!😎😎😎
只“一眼”,就命中我choice-key.py的要害。👍👍👍

  谢谢您🙏🙏🙏


  • AI学伴

    非常感谢您的肯定和赞赏!🙏

    很高兴看到您对脚本开发有着清晰的认识和规划。确实,根据使用场景和需求,我们可以对脚本进行不同程度的优化。

  以下是一些进一步的建议,希望对您的迭代过程有所帮助:

  1. URL校验
    使用正则表达式(re模块)来校验URL是一个很好的选择。您可以创建一个匹配CSDN博文URL模式的正则表达式,这样能够确保只有合法的URL才会被处理。

python自定义函数校验csdn博客url

import re

def validate_url(url):
    csdn_url_pattern = re.compile(r'https://blog\.csdn\.net/\w+/\w+/article/details/\d+')
    return csdn_url_pattern.match(url) is not None

  1. 摘要优化
    处理文本摘要时,您可以考虑使用自然语言处理(NLP)库,如nltkspaCy,来提取文章的摘要或关键词。这些库可以帮助您更准确地识别文本中的重要内容。

  2. 命令行参数
    如果您决定添加命令行参数,argparse确实是一个强大的工具。

以下是一个简单的例子,展示如何使用argparse来添加命令行参数:

示例python脚本

import argparse

def main():
    parser = argparse.ArgumentParser(description='CSDN Blog Analysis Tool')
    parser.add_argument('-k', '--keys', nargs='*', help='Space-separated list of keywords to filter blogs.')
    parser.add_argument('-u', '--url', help='Specific URL of a CSDN blog post to analyze.')
    args = parser.parse_args()

    if args.url:
        # Handle URL input
        pass
    elif args.keys:
        # Handle keyword input
        pass
    else:
        # Handle no input or other logic
        pass

if __name__ == '__main__':
    main()

  1. 异常处理
    在处理网络请求和文件操作时,异常处理是必不可少的。确保您的脚本在遇到错误时能够优雅地处理,并提供有用的反馈。

  2. 代码维护
    随着功能的增加,保持代码的清晰和可维护性是非常重要的。确保添加了足够的注释,并遵循良好的编程实践。


  最后,继续您的迭代和实验,不断改进您的脚本。编程是一个持续学习和成长的过程,期待看到您未来的成果!😊🚀



回页目录


4、结语


  AI时代,学习、工作都ai!

  AI有实力,助我工作更给力!💪💪💪



回页首


上一篇:  全能单行url解码器(超高浓缩“复杂”逻辑lambda,体格虽小功用不减正常形态书写代码)
下一篇: 



我的HOT博:

  本次共计收集404篇博文笔记信息,总阅读量61.76w。数据采集于2024年11月25日 08:23:38,用时7分56.4秒。阅读量不小于6.00k的有 9 9 9篇。

  1. 让QQ群昵称色变的神奇代码
    地址:https://blog.csdn.net/m0_57158496/article/details/122566500
    浏览阅读:6.2w
    点赞:25 收藏:89 评论:17
    (本篇笔记于2022-01-18 19:15:08首次发布,最后修改于2022-01-20 07:56:47)

  2. Python列表(list)反序(降序)的7种实现方式
    地址:https://blog.csdn.net/m0_57158496/article/details/128271700
    浏览阅读:1.3w
    点赞:9 收藏:40 评论:8
    (本篇笔记于2022-12-11 23:54:15首次发布,最后修改于2023-03-20 18:13:55)

  3. pandas 数据类型之 DataFrame
    地址:https://blog.csdn.net/m0_57158496/article/details/124525814
    浏览阅读:1.0w
    点赞:7 收藏:40 
    (本篇笔记于2022-05-01 13:20:17首次发布,最后修改于2022-05-08 08:46:13)

  4. 个人信息提取(字符串)
    地址:https://blog.csdn.net/m0_57158496/article/details/124244618
    浏览阅读:1.0w
    点赞:3 收藏:20 
    (本篇笔记于2022-04-18 11:07:12首次发布,最后修改于2022-04-20 13:17:54)

  5. 罗马数字转换器|罗马数字生成器
    地址:https://blog.csdn.net/m0_57158496/article/details/122592047
    浏览阅读:8.2k
    收藏:3 
    (本篇笔记于2022-01-19 23:26:42首次发布,最后修改于2022-01-21 18:37:46)

  6. 统计字符串字符出现的次数
    地址:https://blog.csdn.net/m0_57158496/article/details/130517025
    浏览阅读:8.1k
    点赞:5 收藏:24 
    (本篇笔记于2023-05-06 22:28:18首次发布,最后修改于2023-05-12 06:21:40)

  7. Python字符串居中显示
    地址:https://blog.csdn.net/m0_57158496/article/details/122163023
    浏览阅读:8.0k
    点赞:1 收藏:12 评论:1
  8. 回车符、换行符和回车换行符
    地址:https://blog.csdn.net/m0_57158496/article/details/123109488
    浏览阅读:6.7k
    点赞:2 收藏:4 
    (本篇笔记于2022-02-24 13:10:02首次发布,最后修改于2022-02-25 20:07:40)

  9. python清屏
    地址:https://blog.csdn.net/m0_57158496/article/details/120762101
    浏览阅读:6.1k
    点赞:1 收藏:10 

推荐条件 阅读量突破6.00k
(更多热博,请点击蓝色文字跳转翻阅)

  • 截屏图片
    在这里插入图片描述
      (此文涉及ChatPT,曾被csdn多次下架,前几日又因新发笔记被误杀而落马。躺“未过审”还不如回收站,回收站还不如永久不见。😪值此年底清扫,果断移除。留此截图,以识“曾经”。2023-12-31)



回页首


老齐漫画头像

精品文章:

  • 好文力荐:齐伟书稿 《python 完全自学教程》 Free连载(已完稿并集结成书,还有PDF版本百度网盘永久分享,点击跳转免费🆓下载。)
  • OPP三大特性:封装中的property
  • 通过内置对象理解python'
  • 正则表达式
  • python中“*”的作用
  • Python 完全自学手册
  • 海象运算符
  • Python中的 `!=`与`is not`不同
  • 学习编程的正确方法

来源:老齐教室


◆ Python 入门指南【Python 3.6.3】


好文力荐:

  • 全栈领域优质创作者——[寒佬](还是国内某高校学生)博文“非技术文—关于英语和如何正确的提问”,“英语”和“会提问”是编程学习的两大利器。
  • 【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛
  • 靠谱程序员的好习惯
  • 大佬帅地的优质好文“函数功能、结束条件、函数等价式”三大要素让您认清递归

CSDN实用技巧博文:

  • 8个好用到爆的Python实用技巧
  • python忽略警告
  • Python代码编写规范
  • Python的docstring规范(说明文档的规范写法)


http://www.kler.cn/a/427992.html

相关文章:

  • 【PyTorch】6.张量运算函数:一键开启!PyTorch 张量函数的宝藏工厂
  • thinkphp6+swoole使用rabbitMq队列
  • 数仓ETL测试
  • buu-pwn1_sctf_2016-好久不见29
  • python3+TensorFlow 2.x(三)手写数字识别
  • 人工智能在计算机视觉中的应用与创新发展研究
  • 应用案例 | 船舶海洋: 水下无人航行器数字样机功能模型构建
  • RK3568平台(内存篇)DDR定频修改
  • OD C卷【热点网站统计】
  • 漫画之家Spring Boot应用:打造您的数字漫画馆
  • 如何从命令行和用户输入收集输入
  • 读取csv里面的文件数据画曲线
  • B4X编程语言:B4J控件的样式设置属性(Style/StyleClasses)
  • 利用R包QstFstComp包进行Qst-Fst分析
  • 处理海量数据的查重方法总结
  • 【WRF运行第一期(Ubuntu)】模型运行前准备
  • 高数极限与连续练习题(自用)
  • 网络渗透实验二(渗透课)
  • 新160个crackme - 109-Jony-crackme
  • ElementUI:el-tabs 切换之前判断是否满足条件
  • docker-3.docker权限问题
  • 开发一个AMT(automatic multicast tunnel)协议库 C++版本,Client,Server详细的设计
  • STM32F103单片机使用STM32CubeMX创建IAR串口工程
  • mac 安装python3和配置环境变量
  • 【Leetcode Top 100】146. LRU 缓存
  • Octo—— 基于80万个机器人轨迹的预训练数据集用于训练通用机器人,可在零次拍摄中解决各种任务