在本教程中,你将了解如何使用 pathlib 模块操作目录和文件的名称。 学习如何读取和写入文件,拼接路径和操作底层文件系统的新方法,以及如何列出文件并迭代它们的一些示例。 大多人处理文件用的最多的还是 os 模快吧,比如下面这样的操作
1 |
> path.rsplit('\\', maxsplit=1)[0] |
或者写出下面这样长长的代码
1 |
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt')) |
使用 pathlib 模块,可以使代码使用优雅,可读和 Pythonic 代码重写上面的两个示例,如:
1 |
> path.parent |
Python 文件路径处理问题
由于许多不同的原因,使用文件和与文件系统交互很重要。 最简单的情况可能只涉及读取或写入文件,但有时候会有更复杂的任务。 也许你需要列出给定类型的目录中的所有文件,查找给定文件的父目录,或者创建一个尚不存在的唯一文件名。 一般情况,Python 使用常规文本字符串表示文件路径。 一般在使用 os,glob 和 shutil 等库的时候会使用到路径拼接的操作,使用os模块拼接起来显得略显复杂,以下示例仅需要三个 import 语句来将所有文本文件移动到归档目录:
1 |
import glob |
使用常规的字符串去拼接路径是可以的,但是由于不同的操作系统使用的分隔符不同,这样就容易出现问题,所以一般我们使用最多的还是使用 os.path.join()。 Python 3.4 中引入了 pathlib 模块(PEP 428)再一次的优化了路径的拼接。使用 pathlib 库的 Path 方法,可以将一个普通的字符串转换为 pathlib.Path 对象类型的路径。 早期,其他软件包仍然使用字符串作为文件路径,但从 Python 3.6 开始,pathlib 模块在整个标准库中得到支持,部分原因是由于增加了文件系统路径协议。 如果你坚持使用传统的 Python,那么 Python 2 也有一个可用的向后移植。 ok,说了那么多下面让我们看看 pathlib 如何在实践中发挥作用。
创建路径
这里我们首先要知道两个用法,先看代码:
1 |
from pathlib import Path |
你真正需要知道的是 pathlib.Path 类。 创建路径有几种不同的方式。 首先,有类方法,如 .cwd(当前工作目录)和 .home(用户的主目录):
1 |
from pathlib import Path |
输出内容
1 |
当前工作目录 /Users/chennan/pythonproject/demo <class 'pathlib.PosixPath'> |
可以发现路径格式为 pathlib.PosixPath 这是在 unix 系统下的显示。在不同的系统上显示的格式也是不一样,在 windows 系统会显示为 WindowsPath。但是不管什么显示类型,都不影响后面的操作。 前面我们提到过可以通过把字符串类型的路径,转换为 Pathlib.Path 类型的路径,经过测试发现在 Python3.4 以后很多模块以及支持该格式的路径。不用转为成字符串使用了。比起 os.path.join 拼接路径的方式, pathlib 使用起来更加的方便,使用示例如下:
1 |
import pathlib |
输出内容:
1 |
/Users/chennan/CDM <class 'pathlib.PosixPath'> |
通过 “/“ 我们就可以对路径进行拼接了,怎么样是不是很方便呢。
读文件和写文件
在我们使用 open 来操作文件读写操作的时候,不仅可以使用字符串格式的路径,对于 pathlib 生成的路径完全可以直接使用:
1 |
path = pathlib.Path.cwd() / 'test.md' |
或者在 pathlib 的基础使用 open,我们推荐使用下面的方式
1 |
import pathlib |
这样写的好处就是 open 里面我们不需要再去传入路径了,直接指定文件读写模式即可。实际上这里的 open 方法,底层也是调用了 os.open 的方法。使用哪种方式看个人的喜好。 pathlib 还提供几种文件的读写方式: 可以不用再使用 with open 的形式即可以进行读写。
1 |
.read_text(): 找到对应的路径然后打开文件,读成str格式。等同open操作文件的"r"格式。 |
使用 resolve 可以通过传入文件名,来返回文件的完整路径,使用方式如下
1 |
import pathlib |
输出
1 |
/Users/chennan/pythonproject/demo/superdemo.py |
需要注意的是 “superdemo.py” 文件要和我当前的程序文件在同一级目录。
选择路径的不同组成部分
pathlib 还提供了很多路径操作的属性,这些属性可以选择路径的不用部位,如 .name: 可以获取文件的名字,包含拓展名。 .parent: 返回上级文件夹的名字 .stem: 获取文件名不包含拓展名 .suffix: 获取文件的拓展名 .anchor: 类似盘符的一个东西,
1 |
import pathlib |
输出内容如下
1 |
name demo.txt |
移动和删除文件
当然 pathlib 还可以支持文件其他操作,像移动,更新,甚至删除文件,但是使用这些方法的时候要小心因为,使用过程不用有任何的错误提示即使文件不存在也不会出现等待的情况。 使用 replace 方法可以移动文件,如果文件存在则会覆盖。为避免文件可能被覆盖,最简单的方法是在替换之前测试目标是否存在。
1 |
import pathlib |
但是上面的方法存在问题就是,在多个进程多 destination 进行的操作的时候就会现问题,可以使用下面的方法避免这个问题。也就是说上面的方法适合单个文件的操作。
1 |
import pathlib |
当 destination文件存在的时候上面的代码就会出现 FileExistsError 异常。 从技术上讲,这会复制一个文件。 要执行移动,只需在复制完成后删除源即可。 使用 with_name 和 with.shuffix 可以修改文件名字或者后缀。
1 |
import pathlib |
可以使用 .rmdir() 和 .unlink() 来删除文件。
1 |
import pathlib |
几个 pathlib 的使用例子
统计文件个数
我们可以使用.iterdir方法获取当前文件下的所以文件.
1 |
import pathlib |
输出内容
1 |
Counter({'.py': 16, '': 11, '.txt': 1, '.png': 1, '.csv': 1}) |
通过配合使用 collections 模块的 Counter 方法,我们获取了当文件夹下文件类型情况。 前面我们说过 glob 模块点这里了解【https://www.cnblogs.com/c-x-a/p/9261832.html】,同样的 pathlib 也有 glob 方法和 rglob 方法,不同的是 glob 模块里的 glob 方法结果是列表形式的,iglob 是生成器类型,在这里 pathlib 的 glob 模块返回的是生成器类型,然后 pathlib 还有一个支持递归操作的 rglob 方法。 下面的这个操作我通过使用 glob 方法,设定规则进行文件的匹配。
1 |
import pathlib |
展示目录树
下一个示例定义了一个函数 tree(),该函数的作用是打印一个表示文件层次结构的可视树,该树以一个给定目录为根。因为想列出其子目录,所以我们要使用 .rglob() 方法:
1 |
import pathlib |
其中 relative_to 的方法的作用是返回 path 相对于 directory 的路径。 parts 方法可以返回路径的各部分。例如
1 |
import pathlib |
返回
1 |
('/', 'Users', 'chennan', 'pythonproject', 'demo') |
获取文件最后一次修改时间
iterdir(),.glob()和.rglob()方法非常适合于生成器表达式和列表理解。 使用stat()方法可以获取文件的一些基本信息,使用.stat().st_mtime可以获取文件最后一次修改的信息
1 |
import pathlib |
甚至可以使用类似的表达式获取上次修改的文件内容
1 |
import pathlib |
.stat().st_mtime 会返回文件的时间戳,可以使用 datetime 或者 time 模块对时间格式进行进一步转换。
其他内容
关于 pathlib.Path 格式路径转换为字符串类型
因为通过 pathlib 模块操作生成的路径,不能直接应用字符串的一些操作,所以需要转换成字符串,虽然可以使用 str() 函数进行转换,但是安全性不高,建议使用 os.fspath() 方法,因为如果路径格式非法的,可以抛出一个异常。str()就不能做到这一点。
拼接符号”/“背后的秘密
/ 运算符由 truediv 方法定义。 实际上,如果你看一下 pathlib 的源代码,你会看到类似的东西。
1 |
class PurePath(object): |
后记
从 Python 3.4 开始,pathlib 已在标准库中提供。 使用 pathlib,文件路径可以由适当的 Path 对象表示,而不是像以前一样用纯字符串表示。 这些对象使代码处理文件路径:
- 更容易阅读,特别是可以使用“/”将路径连接在一起
- 更强大,直接在对象上提供最必要的方法和属性
- 在操作系统中更加一致,因为Path对象隐藏了不同系统的特性
在本教程中,你已经了解了如何创建 Path 对象、读取和写入文件、操作路径和底层文件系统,以及如何遍历多个文件路径等一系列实例。 最后,建议下去自己多加练习,我对文章中的代码都进行了验证,不会出现运行错误的情况。 ————————————————————————————————————————————— 原文: https://realpython.com/python-pathlib/ 译者: 陈祥安 [gallery ids=”6600”] 更多精彩内容,请关注微信公众号: python学习开发。




所以,求求你加个空格吧(逃。
这里提供一些手动的解决方案,比如使用 JavaScript 添加标记,然后 CSS 控制标记的间距,解决方案可以参考:
这个是我用 Vue.js 开发的,实际上就是用了 pangu.js 这个库实现的,原理非常简单,主要目的就是为了方便空格排版。 另外这个网站我也部署了一下,叫做:
点击之后便可以看到一个可选功能,选择 OpenSSH 服务器即可,一般情况下是没有安装的。如果没有安装的话它会提示一个安装按钮,这里我已经安装好了,就提示了一个卸载按钮。
OK,有了它,直接点击安装即可完成 OpenSSH 服务器的安装。 当然如果你是想批量部署 Windows 服务器的话,当然是推荐使用 PowerShell 来自动化部署了。 首先需要用管理员身份启动 PowerShell,使用如下命令看一下,要确保 OpenSSH 可用于安装:
OK,以后就可以非常轻松地用 SSH 连接我的 Windows 服务器了,爽歪歪,上面的需求也成功解决。 以上便是使用 SSH 来连接 Windows 服务器的方法,如果大家有需求可以试试。
然后由于我自己有一个域名,叫做 cuiqingcai.com,然后我就把它设置了二级域名解析,二级域名名称就叫做 love,域名最终就是 love.cuiqingcai.com。 最终的效果大家可以扫码或者复制链接查看一下最终的效果:
感觉还可以吧?如果你也想送这样的礼物的话,可以根据我现有的代码来进行修改,我已经将源码放到 GitHub 了,地址为:
其中心形线的解析方程为: 这个公式代表了绘制坐标点的 x、y 的解析方程,用代码表示出来就是:
里面上架了什么商品?洗水果服务?做饭刷碗服务?捏肩膀服务?还有自动哄老婆机?我惊了。 她把商品发给我,我好奇问她这是干嘛的。 她说:要获得我的洗水果服务,捏肩膀服务,只需要在我的小店里购买使用就好了(作掐腰状)!还有自动哄老婆机,你要惹我生气了,只需要购买一个自动哄老婆机,我就会不生气了!嘿嘿合不合算?
我说:多少钱?999!这么贵的吗! 她说:当然不是啦,亲亲我们店里有活动的,使用优惠券满 999 减 998 呢,您是我的 VIP 唯一专属客户,我会给您发优惠券的呀,使用优惠券只需要一块钱就可以购买了。购买之后,您每次使用一张,我就可以给您洗水果、捏肩膀了!这个情人节的话呢,我要送亲亲 10 张!可省着点话,不能累到店长我啊! 哦哦,卧槽真牛逼啊!于是乎我就快快乐乐领取到了十张优惠券购买了女朋友的这些服务,等着时不时用一张,享受一下帝王级的待遇,美滋滋!哈哈~ 最后,祝大家情人节快乐!幸福!




我们需要从页面中提取出标题、发布人、发布时间、发布内容、图片等内容。一般情况下我们需要怎么办?写规则。 那么规则都有什么呢?怼正则,怼 CSS 选择器,怼 XPath。我们需要对标题、发布时间、来源等内容做规则匹配,更有甚者再需要正则表达式来辅助一下。我们可能就需要用 re、BeautifulSoup、pyquery 等库来实现内容的提取和解析。 但如果我们有成千上万个不同样式的页面怎么办呢?它们来自成千上万个站点,难道我们还需要对他们一一写规则来匹配吗?这得要多大的工作量啊。另外这些万一弄不好还会解析有问题。比如正则表达式在某些情况下匹配不了了,CSS、XPath 选择器选错位了也会出现问题。 想必大家可能见过现在的浏览器有阅读模式,比如我们把这个页面用 Safari 浏览器打开,然后开启阅读模式,看看什么效果:
页面一下子变得非常清爽,只保留了标题和需要读的内容。原先页面多余的导航栏、侧栏、评论等等的统统都被去除了。它怎么做到的?难道是有人在里面写好规则了?那当然不可能的事。其实,这里面就用到了智能化解析了。 那么本篇文章,我们就来了解一下页面的智能化解析的相关知识。
有人可能好奇为什么 Diffbot 这么厉害?我也查询了一番。Diffbot 自 2010 年以来就致力于提取 Web 页面数据,并提供许多 API 来自动解析各种页面。其中他们的算法依赖于自然语言技术、机器学习、计算机视觉、标记检查等多种算法,并且所有的页面都会考虑到当前页面的样式以及可视化布局,另外还会分析其中包含的图像内容、CSS 甚至 Ajax 请求。另外在计算一个区块的置信度时还考虑到了和其他区块的关联关系,基于周围的标记来计算每个区块的置信度。 总之,Diffbot 也是一直致力于这一方面的服务,整个 Diffbot 就是页面解析起家的,现在也一直专注于页面解析服务,准确率高也就不足为怪了。 但它们的算法开源了吗?很遗憾,并没有,而且我也没有找到相关的论文介绍它们自己的具体算法。 所以,如果想实现这么好的效果,那就使用它们家的服务就好了。 接下来的内容,我们就来说说如何使用 Diffbot 来进行页面的智能解析。另外还有 Readability 算法也非常值得研究,我会写专门的文章来介绍 Readability 及其与 Python 的对接使用。
这时候我们可以看到,它帮我们提取出来了标题、发布时间、发布机构、发布机构链接、正文内容等等各种结果。而且目前来看都十分正确,时间也自动识别之后做了转码,是一个标准的时间格式。 接下来我们继续下滑,查看还有什么其他的字段,这里我们还可以看到有 html 字段,它和 text 不同的是,它包含了文章内容的真实 HTML 代码,因此图片也会包含在里面,如图所示:
另外最后面还有 images 字段,他以列表形式返回了文章套图及每一张图的链接,另外还有文章的站点名称、页面所用语言等等结果,如图所示:
当然我们也可以选择 JSON 格式的返回结果,其内容会更加丰富,例如图片还返回了其宽度、高度、图片描述等等内容,另外还有各种其他的结果如面包屑导航等等结果,如图所示:
经过手工核对,发现其返回的结果都是完全正确的,准确率相当之高! 所以说,如果你对准确率要求没有那么非常非常严苛的情况下,使用 Diffbot 的服务可以帮助我们快速地提取页面中所需的结果,省去了我们绝大多数的手工劳动,可以说是非常赞了。 但是,我们也不能总在网页上这么试吧。其实 Diffbot 也提供了官方的 API 文档,让我们来一探究竟。
后台源代码里面的
从上面可以看出,生这个字变成了乱码,请大家特别注意箭头所指的数字。
和大众点评的反爬差不多,都是通过 css 搞得。
而且还有 base64,直接进行解密,但是解密出来的其实是乱码,这个时候其实要做的很简单,把解密后的内容保存为.ttf格式即可。
很明显,每个字可以看到字形和字形编码。 观察现在箭头指的地方和前面箭头指的地方的数字是不是一样啊,没错,就是通过这种方法进行映射的。 所以我们现在的思路似乎就是在源代码里找到箭头指的数字,然后再来字体里找到后替换就行了。 恭喜你,如果你也是这么想的,那你就掉坑里了。 因为每次访问,字体字形是不变的,但字符的编码确是变化的。因此,我们需要根据每次访问,动态解析字体文件。 字体 1:
所以想通过写死的方式也是行不通的。 这个时候我们就要对字体文件进行更深一步的研究了。 3、研究字体文件 刚刚的.ttf 文件我们是看不到内部的东西的,所以这个时候我们要对字体文件进行转换格式,将其转换为 xml 格式,然后来查看: 具体操作如下:
文件很长,我只截取了一部分。 仔细的观察一下,你会发现~这俩下面的 x,y,on 值都是一毛一样的。所以我们的思路就是以一个已知的字体文件为基本,然后将获取到的新的字体文件的每个文字对应的 x,y,on 值进行比较,如果相同,那么说明新的文字对就 可以在基础字体那里找到对应的文字,有点绕,下面举个小例子。 假设: “我” 在基本字体中的名为 uni1,对应的 x=1,y=1,n=1 新的字体文件中,一个名为 uni2 对应的 x,y, n 分别于上面的相等,那么这个时候就可以确定 uni2 对应的文字为”我”。 查资料的时候,发现在特殊情况下,有时候两个字体中的文字对应的 x,y 不相等,但是差距都是在某一个阈值之内,处理方法差不多,只不过上面是相等,这种情况下就是要比较一下。 其实,如果你用画图工具按照上面的 x 与 y 值把点给连起来,你会发现,就是汉字的字形~ 所以,到此总结一下:
这个网站点击鼠标右键审查元素,查看网页源代码是无法用的,但是这个好像只能防住小白啊,简单的按 F12 审查元素,CTRL+u 直接查看源代码(谷歌浏览器)。 这次的目的主要是为了获取下面的链接(重度打码)

然,在搜资料的时候,你会发现,很多教程都是用的 selenium 之类的方法,效率太低,没有啥技术含量。 所以,这篇文章的面向的对象就是 PC 端的大众点评;目标是解决这种反爬虫措施,使用 requests 获取到干净正确的数据; 跟着我,绝不会让你失望。 
这张图片很重要,很重要,很重要,我们要的值,几乎都从这里匹配出来。 这里我们看到了“vxt20”这个变量对应的两个像素值,前面的是控制用哪个数字,后面的是控制用哪一段的数字集合,先记下,后面要用,同时这里的值应该是 6; 这里其实就是整个破解流程最关键的一步了。在这里我们看到了一个链接。 瞎猫当死耗子吧,点进去看看。
可以看到这里面的几个关键数字:font-size:字体大小;还有几个 y 的值,我到后面才知道原来这个 y 是个阈值,起的是个控制的作用。 所以,这一反爬的原理就是:.png)
这里对主要的步骤代码进行解释, 如果你想获取更多的代码,请关注我的公众号,并发送 “大众点评”即可。。 1.获取 css_url 及 span 对应的 TAG 值;


市面上各种代理也是琳琅满目的说··· 相信大家最喜欢用的之一应该就是 某布云。 根据官网的显示他他家的代理是这个样子的:












我实际输入的值全是 1, 然后都被加密了, 没办法,只能去找加密的方法了。 经过一番搜索过后,才发现,原来加密的算法就在源代码里面,这里截个图:
从这里就可以看到具体的算法名以及相关的参数了,你会说,这是什么算法我都不知道啊?搜啊,用关键词搜一下就能知道了。 同时,是不是觉得这个网站好傻逼,这不太简单了吗? 肯定不是!!! 这么简单,说明此处也是必有玄机!!! 至于什么玄机,到后面说,都是泪。
可以看到信息提示要刷新,但是当时是百思不得其解,为毛线要刷新? 困惑了一会之后,我再次从头走了一遍流程,这下我才发现,原来源代码里面的那个长长的数据是会改变的,直到这个时候,我才意识到为什么要我刷新。。。。。。 服务器啊,你就不能直接说参数错误吗?刷新你大爷啊。 果然,我还是太年轻啊。
知道这个坑以后就好办了,用个正则匹配一下就行了,而结果也是对的:





















这个是监控服务器网速的最后成果,显示的是下载与上传的网速,单位为 M。爬虫的原理都是一样的,只不过将数据存到 InfluxDB 的方式不一样而已, 如下图。
点击 ADD DATA SOURCE,进行配置即可,如下图:
其中,name 自行设定;Type 选择 InfluxDB;url 为默认的
接着点击下图中的 edit 进入编辑页面:
从上图中可以发现:
因为是边看,边练习,然后翻译,所以个人理解可能有偏差,有错误的地方,请大家指正。 首先,这个库是用来处理一些嵌套的数据的,作者也在 PyCon 2018 上做了个分享,老美的 PyCon 还是有点质量的,不像国内的,搞的什么玩意。 视频地址:






最后也是最重要的就是参与活动的地址了!!!快来扫码回复领取属于你的福利吧!!!

要是我们能够多个Scrapy一起采集该多好啊 人多力量大。 很遗憾Scrapy官方并不支持多个同时采集一个站点,虽然官方给出一个方法: 将一个站点的分割成几部分 交给不同的scrapy去采集 似乎是个解决办法,但是很麻烦诶!毕竟分割很麻烦的哇 下面就改轮到我们的额主角Scrapy-Redis登场了! 
这张图大家相信大家都很熟悉了。重点看一下SCHEDULER 1. 先来看看官方对于SCHEDULER的定义: SCHEDULER接受来自Engine的Requests,并将它们放入队列(可以按顺序优先级),以便在之后将其提供给Engine 








视频教程链接:
微信二维码[/caption]



点击 Search,可以看到查询结果如下所示:
这里我们选择 Linux-x86_64-Ubuntu-16.04-runfile 的配置,然后点击 Base Installer 部分的 Download 按钮,下载 CUDA 9.0 安装包。 对应的下载命令是:
下载下来之后解压安装即可:

模型训练时则去最大化给定输入序列 x 时输出序列为 y 的条件概率:
以上便是核心的公式,上面的这个就是该模型的优化目标。 在机器翻译上,作者用 Moses (一个 SMT 系统) 建立了一个 phrase based 的翻译模型作为 baseline system ,然后对比了以下四个模型的 BLEU 值
其中第一栏是输入的英语 phrase ,第二栏是用传统的模型得到的最近似的三个法语 phrase,第三栏是用 Encoder-Decoder 模型得到的最近似的三个 phrase。 另外作者还说明该模型可以学习到一个比较好的效果的 Word Embedding 结果,附图如下:
左上角的图代表全局的 Embedding 结果,另外三个图是局部结果,可以看到类似的名词都被聚到了一起。
