首页 > > > 如何让python和你生活息息相关
生活和工作中,充斥着一些枯燥且乏味的事情。所以要让自己从机械重复性劳动中解放出来,才是解放身心的正确姿势。
本文列出了我自己平时在工作和生活中的七个小场景,每个场景都是带有这样重复性,性质的事情,一起看看我是如何用 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/ ,如需转载,请注明出处,否则将追究法律责任。