BLCL的博客小馆

标签 · Python

首页

关于

归档

loading..
Python

一日一技:如何正确处理多行字符串的缩进问题

有时候,我们需要使用多行字符串配合format格式化函数来生成Markdown文本。例如,我现在开发了一个AI对话机器人,我发送一个txt文件过去,他首先帮我总结整个文件的内容,然后以问答的形式列出10个要点。你的代码可能是这样写的:1234567891011121314def bot(text):summary = summary_text_by_gpt(text)qa = get_qa_by_gpt(text)output = '''## 文本总结{summary}## 核心问答{qa}'''return output返回Markdown以后,通过前端渲染出正常的文本。但如果你直接这样写,你会发现Markdown的渲染好像出问题了。如下图所示:为什么会出现这个问题呢?其实很简单,因为你的Markdow..

更多
loading..
PythonJSON

一日一技:为什么这个JSON无法解析?

我们知道,Python里面,json.dumps是序列化操作,json.loads是反序列化操作。当我使用json.dumps把一个字典转换为字符串以后,也可以使用json.loads把这个字符串转换为字典。那么,有没有可能出现这样的情况:某个字典,使用json.dumps转换成了字符串s。但是当我使用json.loads(s)时,却会报错?你别不信,我们来做一个实验。执行下面这段代码,打印出一段JSON字符串:12345678910111213import jsontext = '''## 摘要这篇文章主要包含xx和yy## 详情1. abc2. def'''item = {'title': '关于abc', 'raw': text}output = json.dumps(item, ensure_as..

更多
loading..
Python

一日一技:setup.py里面的两个小技巧

当你要自己发布一个Python包时,下面这两个小技巧可能对你有用。pip安装后执行代码今天公众号粉丝群里面,有同学提问:这个同学自己开发了一个Python包,这个包在使用pip安装时,会产生一些临时文件。他希望安装完成以后,能够自动清理这些临时文件。要实现这个需求,可以使用Python自带的setuptools来实现。代码如下:12345678910111213141516171819202122import osfrom setuptools import setup, find_packagesfrom setuptools.command.install import installclass CustomInstallCommand(install): """自定义安装命令,执行标准安装后跟..

更多
loading..
PythonUnicode

一日一技:怎么中文也属于字母?

我最近在使用一个第三方库,叫做RapidFuzz。它有一个工具函数,叫做utils.default_process,在官方文档里面,是这样介绍的:红色方框里面说,这个函数可以移除所有的非alphanumeric字符。如果我们使用翻译软件,会发现alphanumeric的意思是字母和数字。如下图所示:因此,我想当然的觉得,这个功能函数,只会保留26个英文字母的大小写加上10个数字,一共62个字符。把除此之外的所有其他字符都移除掉。但我经过测试,它竟然没有办法过滤掉中文字符,如下图所示。难道终于也属于字母?于是我到Github上面去给这个项目提Issue。但作者却说这个函数没有问题,并且使用Python的.isalnum()来做测试,发现Python也会认为中文也是alphanumeric。如下图所示:这就非..

更多
loading..
Python

一日一技:Python工具脚本如何调用外层模块

我三年前写过一篇文章:《小问题大隐患:如何正确设置 Python 项目的入口文件?》。讲到Python项目应该如何正确组织代码结构。入口文件应该在最外面,调用关系应该是从外向内调用。而不要学Java,从一个很深层的文件夹里面往外调用。不过我在这篇文章的最后,也提到了一种例外情况,那就是工具脚本不受这个规则的限制。如下图所示。今天有同学在问我,这种情况应该怎么调用,才能让remove_outdated_data.py正确导入models里面的模块。我们今天就来说明一下。首先,我们来创建一个示例程序,结构如下图所示:其中,aa.py文件的内容为:12def i_am_func(): print('我是一个函数')test.py文件的内容为:1234from models.aa import i_am_f..

更多
loading..
PythoniOS消息推送

一日一技:iOS下的开源免费消息推送服务

我们在部署代码到线上以后,可能会需要在一些情况下给自己发报警通知。如果是公司的线上业务,一般会有公司内部的各种通知工具。但如果是自己的个人服务,我们应该怎么推送消息呢?有些同学可能使用过叮叮或者飞书机器人,但是这些机器人要发送通知还需要拉个群,稍微有点麻烦。有些同学可能使用的是Telegram,但使用它需要梯子也不太方便。如果你的手机是iPhone,那么你可以使用一个开源免费超级轻量级的消息推送服务:Bark.使用Bark只需要简单调用接口即可给自己的iPhone发送推送。它只依赖苹果APNs,及时、稳定、可靠。不会消耗设备的电量, 基于系统推送服务与推送扩展,APP本体并不需要运行。能够使用点对点加密,实现隐私安全,确保即使是Bark的开发者在内的所有人都无法窃取你的隐私。使用Bark非常简单,首先在A..

更多
loading..
Python爬虫通用爬虫

GnePro:文章类通用爬虫接口

GnePro是开源项目GNE的付费版,能够实现如下功能:输入任意文章页面的URL,返回标题/作者/正文/发布时间/图片/面包屑等一系列信息支持异步加载文章页提取支持上传自定义的HTML代码提取正文支持自动检测网页编码支持自动提取网页全部URL在8个国家13万个新闻类网站进行测试,准确率高达90%提取文章正文12345678910111213141516171819import requestsimport jsonurl = "https://crawler.kingname.info/gne/crawl"body = { "url": "https://www.kingname.info/2023/10/17/rubbish/", "js": False, "charset": "auto"}he..

更多
loading..
Python后端

一日一技:分布式系统的低成本权限校验机制

经常关注未闻Code的同学都知道,我做了一个叫做GNE的开源项目,它能够自动提取新闻类网页的正文。效果远远好于市面上其他的开源新闻提取工具。大家可能不知道,GNE还有一个高级版,叫做GnePro。它可以让你输入URL就自动提取新闻的正文,提取的字段比GNE多得多。并且已经在8个国家13万个网站上做过测试,识别准确率100%。GnePro是使用K8S搭建的爬虫集群。背后有几十台服务器,通过一个网关做负载均衡。在设计GnePro权限机制的时候,我希望它能够尽量简单,尽量不依赖第三方的组件。常规的权限校验机制一般是这样的,用户登录以后,在Cookies里面会有一个SessionId.当用户要查询数据时,往后端发起请求。后端从请求中拿到这个SessionId,到Redis或者其他数据库中,查询到这个用户的Sess..

更多
loading..
Python

一日一技:警告但不禁止,遗留代码的优化策略

在之前的多篇文章中,我都反复告诫大家,不要滥用字典来传大量数据。因为当你的函数收到一个字典的时候,你根本不知道这个字典里面有哪些Key,你必须有一层一层往上看,找到所有尝试往字典里面添加新Key的地方,你才能知道它总共有哪些Key。但是,在正常公司项目中,我们可能会需要维护一些历史遗留代码。代码规模大,函数调用层级非常深。并且之前的人已经使用字典来传递了大量的数据。短时间内,我们没有办法直接把字典改成Dataclass。那么我们能做的,就是尽量避免后续的维护者往里面加入新的Key。我以前遇到过一个项目,它有一个字典,刚刚开始初始化的时候,只有5个Key。这个字典作为参数被传入了很多个函数,每个函数都会往它里面加很多个Key。到最后,这个字典里面已经有40多个Key了。对历史遗留代码的修改,必须要谨小慎微,..

更多
PythonDocker

一日一技:如何安全运行别人上传的Python代码?

写后端的同学,有时候需要在网站上实现一个功能,让用户上传或者编写自己的Python代码。后端再运行这些代码。涉及到用户自己上传代码,我们第一个想到的问题,就是如何避免用户编写危险命令。如果用户的代码里面涉及到下面两行,在不做任何安全过滤的情况下,就会导致服务器的Home文件夹被清空。12import osos.system('rm -rf ~/*')有人想的比较简单,直接判断用户的代码里面有没有os.system、exec、subprocess……这些危险关键词不就可以了吗?这种想法乍看起来没有问题,但细想下,就会发现非常天真。如果用户的代码像下面这样写,你又要如何应对?123456789import requestscode = requests.get('https://www.kingname.in..

更多
1235