分类 python 下的文章

想象成左右两拨人,一边男一边女,然后进行匹配。

  • 男生和女生之间互相中意的,可以进行匹配
  • 男生中意的女生、女生中意的男生都可以不止一个
  • 要得到最多的匹配对数
def test():
    def find(index: int):
        for j in range(girls):
            # 对于左侧的第i个男生 
            # 和右侧第j个女生可以匹配 
            # 并且此时第j个女生暂时没有匹配
            if relationships[index][j] is True and status[j] is False:
                # 将第j个女生标记为马上进行匹配
                status[j] = True
                # 如果第j个女生没有匹配结果 或者 之前匹配的那个男生可以找到新的女生进行匹配
                if res.get(j) is None or find(res[j]):
                    # 那就把当前第i个男生和第j个女生正式匹配
                    res[j] = index
                    # 返回匹配成功
                    return True
        # 返回匹配失败
        return False
    boys = 4
    girls = 4
    relationships = {
        0: [False, True, False, True],
        1: [False, True, False, False],
        2: [True, False, True, False],
        3: [False, False, False, True],
    }
    total = 0
    res = {} # 匹配结果
    for index in range(boys):
        status = [False] * girls
        if find(index):
            total += 1
    print(total, res)

Pillow

今天找一个标准文件,结果没找到能下载的,后来折腾半天发现道客巴巴有,质量还行。

扒下来是图片文字分离的,文字坐标倒是有了,不过还在研究怎么合并到pdf上去。

这不是本文重点,重点是怎么合并图片到PDF,谷歌许多,都不太理想,最后看到说用Pillow,一试效果还不错。

Code

几个说明:

  • 最后调用save方法的_rgb对应应当是第一页的图片,所以程序循环里面有一个判断
  • 我对文件夹里面的图片进行了排序,请自行修改lambda表达式
  • img到rgb是进行了RGBA到RGB的转换
  • 注意这个代码非常吃内存,但好消息是不会崩!

搜寻过程中了解到的一些工具/库:img2pdf pgmagick ImageMagick fpdf PyPDF2

要提一下的是ImageMagick也不崩,但量大的时候命令行都显示完成了,任务管理器还是显示在占用内存。。

最后分享代码如下:

from PIL import Image
from pathlib import Path

def png_to_pdf():
    fpath = Path(r"path/to/images")
    imgs = []
    paths = [path for path in fpath.iterdir()]
    paths = sorted(paths, key=lambda p: int(p.stem.split("_")[-1]))
    for index, path in enumerate(paths):
        img: Image.Image = Image.open(str(path.resolve()))
        rgb = Image.new('RGB', img.size, (255, 255, 255))
        rgb.paste(img, mask=img.split()[3]) 
        if index == 0:
            _rgb = rgb
        else:
            imgs.append(rgb)

    pdf_path = str(Path("filename.pdf").resolve())
    _rgb.save(pdf_path, "PDF", resolution=200.0, save_all=True, append_images=imgs)

if __name__ == "__main__":
    png_to_pdf()

设计师里面的“提升为”就是在应用自定义部件,但是一看到这个.h就感觉不太好了,网上一搜都是新建头文件云云。。
2020-08-09T04:51:12.png
我以为得写C++呢!

遇事不决问谷歌

然后,果然还是在StackOverflow找到了答案。
2020-08-09T04:54:08.png

原来设计师这个只是一个提示,本质上就是替换了一下字符,所以只需要填写类名和你预先写好的py文件的相对路径即可。

注意相对路径的形式,末尾是.h不是.py,斜杠方向不要错了,这样通过pyuic5转换ui文件到py文件时才会生成正确的导入。

path/to/py.h

由于自用的浏览器cookie管理插件导入导出时用的是字典形式,而python里面对[{}, {}]的cookies加载支持不太友好。
所以根据RFC6265和RequestsCookieJar源码,写了一个适用于此形式cookie的转换脚本,便于python载入使用。
代码如下:

'''
@作者: weimo
@创建日期: 2020-04-11 21:45:46
@上次编辑时间: 2020-04-11 22:37:48
@一个人的命运啊,当然要靠自我奋斗,但是...
'''
import json
from pathlib import Path
from http.cookiejar import Cookie
from requests.cookies import RequestsCookieJar

def convert(cookies_path: str = "cookies.json"):
    # convert [{}, {}] cookies to RequestsCookieJar format
    try:
        _cookies = json.loads(Path(cookies_path).read_text(encoding="utf-8"))
    except Exception as e:
        return
    BASECOOKIE = {
        "version": 0,
        "name": "",
        "value": "",
        "port": None,
        "port_specified": False,
        "domain": "",
        "domain_specified": False,
        "domain_initial_dot": False,
        "path": "/",
        "path_specified": False,
        "secure": False,
        "expires": None,
        "discard": False,
        "comment": None,
        "comment_url": None,
        "rest": {},
    }
    cookies = RequestsCookieJar()
    for c in _cookies:
        BASECOOKIE["name"] = c["name"]
        BASECOOKIE["value"] = c["value"]
        if c["domain"] != "":
            BASECOOKIE["domain"] = c["domain"]
            BASECOOKIE["domain_specified"] = True
            if c["domain"].split(".").__len__() == 3:
                BASECOOKIE["domain_initial_dot"] = True
        BASECOOKIE["path"] = c["path"]
        BASECOOKIE["secure"] = c["secure"]
        BASECOOKIE["expires"] = c.get("expirationDate")
        if c["path"] != "":
            BASECOOKIE["path"] = c["path"]
            BASECOOKIE["path_specified"] = True
        if c["httpOnly"]:
            BASECOOKIE["rest"].update({"httpOnly":None})
        if c["hostOnly"]:
            BASECOOKIE["rest"].update({"hostOnly":None})
        cookies.set_cookie(Cookie(**BASECOOKIE))
    return cookies

if __name__ == "__main__":
    convert("cookies.json")