更新了README.md

master
jackfrued 2024-01-02 20:43:08 +08:00
parent 965af7c53f
commit cd4d226f34
4 changed files with 36 additions and 53 deletions

View File

@ -14,9 +14,9 @@
### 视频资源 ### 视频资源
1. [《Python零基础教程快速上手》](https://www.bilibili.com/video/BV1FT4y1R7sz) - Python基础部分的视频因为随堂录制有的时候声音会有点小点赞过3000就为大家重新录制一套声音和画面都更好的精讲版视频。 视频在抖音和B站都可以找到有兴趣的小伙伴可以关注我的抖音或B站账号最近刚刚起号还希望大家多多支持非常感谢
2. [《Python零基础数据库可视化教程》](https://www.bilibili.com/video/BV1dA411w7tu)- 数据库部分的视频随堂录制数据库部分讲得比较简单后面还讲了一些做数据可视化系统的内容我自己对这套视频不是很满意点赞过2000之后就重新做一套面向数据分析师精讲数据库的视频重点放在SQL和业务查询知识上解决数据分析师日常提数问题。
3. [《Scrapy爬虫框架教学》](https://www.bilibili.com/video/BV1QY411F7Vt)- 爬虫框架Scrapy教学视频随堂录制讲解了一个爬取淘宝商品信息的项目有一点实用价值爬虫本身并不是我感兴趣的内容就将就看看吧。 <img src="res/qrcode.JPG" style="zoom:24%;" />
### 文件资源 ### 文件资源
@ -30,7 +30,7 @@
1. 骆昊的Python学习群-1群号7890507362000人大群。 1. 骆昊的Python学习群-1群号7890507362000人大群。
2. 骆昊的Python学习群-2群号8375903102000人大群。 2. 骆昊的Python学习群-2群号8375903102000人大群。
3. 骆昊的Python学习群-3群号7844302561000人大群。 3. 骆昊的Python学习群-3群号7844302562000人大群。
<img src="https://github.com/jackfrued/mypic/raw/master/20220616120218.JPG" style="zoom: 75%;"> <img src="https://github.com/jackfrued/mypic/raw/master/20220616120218.JPG" style="zoom: 75%;">

BIN
res/qrcode.JPG 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 731 KiB

View File

@ -17,7 +17,7 @@ Python语言支持很多种运算符我们先用一个表格为大家列出
| `is` `is not` | 身份运算符 | | `is` `is not` | 身份运算符 |
| `in` `not in` | 成员运算符 | | `in` `not in` | 成员运算符 |
| `not` `or` `and` | 逻辑运算符 | | `not` `or` `and` | 逻辑运算符 |
| `=` `+=` `-=` `*=` `/=` `%=` `//=` `**=` `&=` `|=` `^=` `>>=` `<<=` | (复合)赋值运算符 | | `=` `+=` `-=` `*=` `/=` `%=` `//=` `**=` `&=` `\|=` `^=` `>>=` `<<=` | (复合)赋值运算符 |
>**说明:** 上面这个表格实际上是按照运算符的优先级从上到下列出了各种运算符。所谓优先级就是在一个运算的表达式中,如果出现了多个运算符,应该先执行哪个运算再执行哪个运算的顺序。在实际开发中,如果搞不清楚运算符的优先级,可以使用圆括号来确保运算的执行顺序。 >**说明:** 上面这个表格实际上是按照运算符的优先级从上到下列出了各种运算符。所谓优先级就是在一个运算的表达式中,如果出现了多个运算符,应该先执行哪个运算再执行哪个运算的顺序。在实际开发中,如果搞不清楚运算符的优先级,可以使用圆括号来确保运算的执行顺序。

View File

@ -15,9 +15,9 @@ pip install PyPDF2
```Python ```Python
import PyPDF2 import PyPDF2
reader = PyPDF2.PdfFileReader('test.pdf') reader = PyPDF2.PdfReader('test.pdf')
page = reader.getPage(0) for page in reader.pages:
print(page.extractText()) print(page.extract_text())
``` ```
> **提示**上面代码中使用的PDF文件“test.pdf”以及下面的代码中需要用到的PDF文件也可以通过下面的百度云盘地址进行获取。链接:https://pan.baidu.com/s/1rQujl5RQn9R7PadB2Z5g_g 提取码:e7b4。 > **提示**上面代码中使用的PDF文件“test.pdf”以及下面的代码中需要用到的PDF文件也可以通过下面的百度云盘地址进行获取。链接:https://pan.baidu.com/s/1rQujl5RQn9R7PadB2Z5g_g 提取码:e7b4。
@ -36,31 +36,18 @@ pdf2text.py test.pdf
上面的代码中通过创建`PdfFileReader`对象的方式来读取PDF文档该对象的`getPage`方法可以获得PDF文档的指定页并得到一个`PageObject`对象,通过`PageObject`对象的`rotateClockwise`和`rotateCounterClockwise`方法可以实现页面的顺时针和逆时针方向旋转,通过`PageObject`对象的`addBlankPage`方法可以添加一个新的空白页,代码如下所示。 上面的代码中通过创建`PdfFileReader`对象的方式来读取PDF文档该对象的`getPage`方法可以获得PDF文档的指定页并得到一个`PageObject`对象,通过`PageObject`对象的`rotateClockwise`和`rotateCounterClockwise`方法可以实现页面的顺时针和逆时针方向旋转,通过`PageObject`对象的`addBlankPage`方法可以添加一个新的空白页,代码如下所示。
```Python ```Python
import PyPDF2 reader = PyPDF2.PdfReader('XGBoost.pdf')
writer = PyPDF2.PdfWriter()
from PyPDF2.pdf import PageObject for no, page in enumerate(reader.pages):
if no % 2 == 0:
# 创建一个读PDF文件的Reader对象 new_page = page.rotate(-90)
reader = PyPDF2.PdfFileReader('resources/XGBoost.pdf')
# 创建一个写PDF文件的Writer对象
writer = PyPDF2.PdfFileWriter()
# 对PDF文件所有页进行循环遍历
for page_num in range(reader.numPages):
# 获取指定页码的Page对象
current_page = reader.getPage(page_num) # type: PageObject
if page_num % 2 == 0:
# 奇数页顺时针旋转90度
current_page.rotateClockwise(90)
else: else:
# 偶数页反时针旋转90度 new_page = page.rotate(90)
current_page.rotateCounterClockwise(90) writer.add_page(new_page)
writer.addPage(current_page)
# 最后添加一个空白页并旋转90度 with open('temp.pdf', 'wb') as file_obj:
page = writer.addBlankPage() # type: PageObject writer.write(file_obj)
page.rotateClockwise(90)
# 通过Writer对象的write方法将PDF写入文件
with open('resources/XGBoost-modified.pdf', 'wb') as file:
writer.write(file)
``` ```
### 加密PDF文件 ### 加密PDF文件
@ -70,14 +57,16 @@ with open('resources/XGBoost-modified.pdf', 'wb') as file:
```Python ```Python
import PyPDF2 import PyPDF2
reader = PyPDF2.PdfFileReader('resources/XGBoost.pdf') reader = PyPDF2.PdfReader('XGBoost.pdf')
writer = PyPDF2.PdfFileWriter() writer = PyPDF2.PdfWriter()
for page_num in range(reader.numPages):
writer.addPage(reader.getPage(page_num)) for page in reader.pages:
# 通过encrypt方法加密PDF文件方法的参数就是设置的密码 writer.add_page(page)
writer.encrypt('foobared') writer.encrypt('foobared')
with open('resources/XGBoost-encrypted.pdf', 'wb') as file:
writer.write(file) with open('temp.pdf', 'wb') as file_obj:
writer.write(file_obj)
``` ```
### 批量添加水印 ### 批量添加水印
@ -85,23 +74,17 @@ with open('resources/XGBoost-encrypted.pdf', 'wb') as file:
上面提到的`PageObject`对象还有一个名为`mergePage`的方法可以两个PDF页面进行叠加通过这个操作我们很容易实现给PDF文件添加水印的功能。例如要给上面的“XGBoost.pdf”文件添加一个水印我们可以先准备好一个提供水印页面的PDF文件然后将包含水印的`PageObject`读取出来然后再循环遍历“XGBoost.pdf”文件的每个页获取到`PageObject`对象,然后通过`mergePage`方法实现水印页和原始页的合并,代码如下所示。 上面提到的`PageObject`对象还有一个名为`mergePage`的方法可以两个PDF页面进行叠加通过这个操作我们很容易实现给PDF文件添加水印的功能。例如要给上面的“XGBoost.pdf”文件添加一个水印我们可以先准备好一个提供水印页面的PDF文件然后将包含水印的`PageObject`读取出来然后再循环遍历“XGBoost.pdf”文件的每个页获取到`PageObject`对象,然后通过`mergePage`方法实现水印页和原始页的合并,代码如下所示。
```Python ```Python
import PyPDF2 reader1 = PyPDF2.PdfReader('XGBoost.pdf')
reader2 = PyPDF2.PdfReader('watermark.pdf')
writer = PyPDF2.PdfWriter()
watermark_page = reader2.pages[0]
from PyPDF2.pdf import PageObject for page in reader1.pages:
page.merge_page(watermark_page)
writer.add_page(page)
reader1 = PyPDF2.PdfFileReader('resources/XGBoost.pdf') with open('temp.pdf', 'wb') as file_obj:
reader2 = PyPDF2.PdfFileReader('resources/watermark.pdf') writer.write(file_obj)
writer = PyPDF2.PdfFileWriter()
# 获取水印页
watermark_page = reader2.getPage(0)
for page_num in range(reader1.numPages):
current_page = reader1.getPage(page_num) # type: PageObject
current_page.mergePage(watermark_page)
# 将原始页和水印页进行合并
writer.addPage(current_page)
# 将PDF写入文件
with open('resources/XGBoost-watermarked.pdf', 'wb') as file:
writer.write(file)
``` ```
如果愿意,还可以让奇数页和偶数页使用不同的水印,大家可以自己思考下应该怎么做。 如果愿意,还可以让奇数页和偶数页使用不同的水印,大家可以自己思考下应该怎么做。