ITPub博客

首页 > > > 如何让python和你生活息息相关

如何让python和你生活息息相关

作者:choubou 时间:2019-12-13 14:10:28 0 删除 编辑

生活和工作中,充斥着一些枯燥且乏味的事情。所以要让自己从机械重复性劳动中解放出来,才是解放身心的正确姿势。

本文列出了我自己平时在工作和生活中的七个小场景,每个场景都是带有这样重复性,性质的事情,一起看看我是如何用 Python 这门简单易懂的编程语言去解决这些问题。

1:批量修改文件名

一般来说,注重信息安全的公司都不会允许员工私自安装第三方软件。这样的情况就发生在公司给我配的 Windows 笔记本上。

如果你用是的 macOS,那么你可以很快地选中相同类型的一批文件,然后右键调出系统自带的重命名功能批量修改文件命名。但是这些命名修改只能实现一些简单地头尾修改或是替换,如果想要修改文件拓展名则不行。

所以不管是用 Windows 也好,还是用 macOS 也好,我就自己写一个简单的 Python 脚本吧!假设我现在有这么一堆文件,都是 .png 为后缀的,我想把它们全部都换成 .jpg 格式。

普通版

碰上我上面说的这种无法私自安装第三方软件的用不了的情况,那么你就要自己手动一个一个右键然后重命名了。

Python 版

我可以简单利用 Python 内置的 os 库来进行文件命名的修改操作。

#!usr/bin/env python3

#coding:utf-8

import os

os.chdir(r'/Users/linxiaoyue/Desktop/pictures')

#os.listdir 函数可以直接获取当前文件夹下所有可见文件的文件名

old_names = os.listdir(os.getcwd)

new_names = list(map(lambda x: x.replace('.png', '.jpg'), old_names))

# 使用内置的 zip 方法一一对应地进行迭代

for old_name, new_name in zip(old_names, new_names):

os.renames(old_name, new_name) #os.renames方法直接替换文件名

print('文件已完成重命名……✅')

一般的文件名重命名到这就可以结束了。

但是如果碰到是这种中英文标点混杂的极端方式命名的文件,只想要以当中的中文来命名怎么办?

这时候就可以加入一个正则表达式的功能,可以让我们的程序更加强大。关于正则表达式的相关介绍可以参考王树义老师的这篇文章:

关联阅读:如何用 Python 和正则表达式抽取文本结构化信息?

Python 正则版

#!usr/bin/env python3

#coding:utf-8

import re

import os

os.chdir(r'/Users/linxiaoyue/Desktop/rename_file')

old_names = os.listdir(os.getcwd)

###################################

def file_rename(text):

contexts = re.findall(r'[\\u4e00-\\u9fa5]', text)

return ''.join(contexts) + '.md'

new_names = list(map(file_rename, old_names))

###################################

for old_name, new_name in zip(old_names, new_names):

os.renames(old_name, new_name) #os.renames方法直接替换文件名

这里我就仅调用了 Python 内置的 re 库用来实现正则表达式方法, \\u4e00-\\u9fa5 这一范围内的 unicode 字符已经基本涵盖了所有中文单字,可以直接将当中所有中文抽取出来后再拼贴起来。最后利用内置的 map 函数对旧文件名中的每个文件名进行替换操作,并再转换成列表形式。

这样,复杂的命名情况也能迎刃而解。

场景 2:工作模板

不知道你们是否有对每天工作记录的习惯?我每天到公司都会建立一个以当天日期命名的工作记录文件夹,当中存放简单的工作索引并将当天工作的所有文件都会放到里面。一方面,便于我不会将工作需要的文件乱放;另一方面,还便于我回顾我这周都做了哪些事情并给同事上报工作计划。

普通版

没学过编程的朋友可能思路就是:新建一个以当天日期命名的文件夹→新建一个 Word 或记事本→打开 Word 或记事本→复制黏贴相应模板或输入相关内容→保存文档。

如果这样做每天你可能要花上大概 5、6 分钟来做,那这样就少那么 5、6 分钟来逛少数派了( 少数派打钱!逃 )

Python 版

基本上我打开 Word 的次数屈指可数,因为要写报告的次数不算多;反而是 Markdown 的 .md 格式或者普通的记事本的 .txt 格式才是我比较喜欢的。所以我就通过 Python 写了一个每天自动生成模板,并创建一个 Markdown 样式的工作记录文档。基本思路如下:

自动新建一个以日期命名的文件夹

在文件夹里又新建一个 .md 格式的 Markdown 文档

然后在 .md 文档中写入模板

理清思路后就花了 10 分钟写了以下的代码:

#!usr/bin/env python3

#coding:utf-8

import time

import os

os.chdir(r'/Users/linxiaoyue/Desktop/')

def main:

# 创建文件夹

today_date = time.strftime(('%Y%m%d'), time.localtime) #time.localtime用于生成当前时间

file_path = os.getcwd + '/{}'.format(today_date) #os.getcwd 用于获取当前 Python 的当前路径

if os.path.exists(file_path): #检测当前路径是否已经存在文件夹

raise ValueError('工作记录文件夹已存在:{}'.format(file_path))

else:

print('文件夹已生成✔')

os.mkdir(file_path) #如果路径不存在文件夹则新建一个

os.chdir(file_path)

# 模板内容

template = """# {} 工作记录

1.

2.

3.

""".format(time.strftime('%Y/%m/%d'), time.localtime)

print('✨✨✨✨✨ 模板内容生成!✨✨✨✨✨')

print(template)

# 创建模板文档

with open(r'{}工作记录.md'.format(today_date), 'w+', encoding='utf-8') as f:

f.write(template)

print('✨✨✨✨✨ 记录文件路径生成完毕!✨✨✨✨✨')

print(file_path)

if __name__ == '__main__':

main

这里我主要就利用了 Python 内置的 os 库和 time 库。前者主要是对系统进行操作,后者顾名思义就是有关于一些时间的处理。当中模板的写法看起来好像蛮丑陋地,但是其实只有这样写才能显示出 Markdown 相关样式。

如果你是习惯性地使用电脑来记录固定格式的文档,如日记、合同等,你可以尝试一下我的这个思路。如果是涉及到生成固定模板的 Word,那我推荐你去了解一下 docx 这个第三方库。

场景 3:信息获取

前不久我的同事让我帮他处理一个项目的文本数据,要求很简单:将文本中带有上海相关地址的信息(区、镇、街道)进行隐藏处理。

我的思路就是:将数据中包含地址的文本和包含地址信息的文本相匹配,匹配上的文本替换成「XXX」符号。

那么问题来了,我去哪里找一个包含地址信息的文本数据呢?好在我找到了一个包含上海区、镇街道相关名称的网页,那么我如何把上面的数据拿下来呢?

普通版

换做是以前懵懂单纯的我,我肯定是:打开网页 → 复制黏贴到 Excel 中 → 去除多余空格。如果数量少其实也就手动复制黏贴了,但是数量多了肯定没辙;而且我相信我国目前的城市,下设街镇数目肯定不是那种屈指可数的……

Python版

带着「偷懒」的思维,我肯定是想着怎么从这个网站上把公开的信息给爬下来。于是就有了下面的代码:

#!usr/bin/env python3

#coding:utf-8

import requests

from bs4 import BeautifulSoup

url = 'http://www.tcmap.com.cn/shanghai/'

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'

}

response = requests.get(url, headers=headers) #发送HTTP请求

response .encoding = 'gb18030' #设置一下网站的中文编码

soup = BeautifulSoup(response.text, 'html.parser') #使用 BeautifulSoup 进行解析

streets = []

# 找到数据对应的 html 节点,然后使用get_text函数获取

for street in soup.find_all('a', class_='blue'):

streets.append(street.get_text)

# 最后写入到相关文件夹中

with open(r'/Users/linxiaoyue/Desktop/address.txt', 'w', encoding='utf-8') as f:

f.write('\n'.join(streets[:238]))

这里我仅用第三方的 requests 库访问链接,然后用 Beautifulsoup 库来提取页面源代码中的数据,最后将得到的数据存储到一个列表中。

不过这里注意的是,因为我爬取的这个网站应该是比较久远了,所以在网页维护上做的不是特别规范,所以也会爬取到一些其他的东西。我想要的数据到第 238 位索引截止。(感兴趣的朋友可以试着把 streets[:238] 连同方括号的所有内容去掉,看看会出现什么信息。)

拿到这些地址数据后,我就可以快速做掉同事交办的任务了!

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4548/viewspace-3131307/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-10-08

  • 博文量
    175
  • 访问量
    10708