在这个项目中,你将学习怎么运用Python库和文档来解码一个文档中的秘密音讯。
1. 项目背景
一天早上,我找不到房子的钥匙了,不久我收到朋友发来的信息,信息上说:“你房子的钥匙被咱们藏起来了,要找到钥匙有必要解决一个谜题,在你的电脑上有一个文件夹,里边有很多张相片,当相片的文件名中的数字被移除时,这些重命名后的相片会显露出一个隐秘的信息,它能够指引你找到房子的钥匙”。
逐个命名这50张相片会花上好长时间,所以我有必要在我朋友回来之前想办法解决这个谜题。
2. 项目方针
写一个程序,移除相片称号中的数字,使得重新命名后的相片显现出一个隐秘的信息。
翻开文件夹,里边大约有50张相片,现在相片的顺序是乱的,无法得知其隐含的隐秘音讯:
运用程序去除文件称号中的数字后,你将得到这样的相片顺序:
这些重命名后的相片显露出了一个隐秘的信息:
请点击此处输入图片描述
KEYS ARE IN THE CLOSET. BEHIND THE SHOE BOX.
请点击此处输入图片描述
3. 代码完成
思考怎么编写这个程序呢?需求几个进程?其实就两个进程:
1. 翻开文件夹,并获取文件的文件称号
2. 给这些文件重命名,去除文件称号中的数字
# -*- coding:utf-8 -*-
# 导入 os 模块
import os
def rename_files():
'''
函数用于获取文件的文件称号,并去除文件称号中指定的数字
'''
# 第一步:从文件夹获取文件的文件称号
rename_list = os.listdir(r"/Users/cunxi/Python_Project/private_news/prank")
# 获取当时的作业目录
saved_path = os.getcwd()
# 打印作业目录
print('当时的作业目录是:' + saved_path)
# 切换当时的作业目录至要命名文件的地点目录
os.chdir(r'/Users/cunxi/Python_Project/private_news/prank')
# 第二步:针对列表中每一个文件的文件称号,去除数字,对其重新命名
for rename_file in rename_list:
# 打印重命名前的文件的文件称号
print("原始文件称号:" + rename_file)
# 去除文件称号中的数字,对其重命名
os.rename(rename_file,rename_file.translate(None,'0123456789'))
# 打印重命名后的文件的文件称号
print("重命名后的文件称号:" + rename_file.translate(None,'0123456789'))
# 履行函数
rename_files()
在输出区能够看到输出成果,返回到之前的文件夹中,检查文件,发现现已被成功重命名:
经过代码,咱们破解了朋友的隐秘信息,找到了自己的钥匙被藏在哪里了:
KEYS ARE IN THE CLOSET. BEHIND THE SHOE BOX.
假如需求程序用到的相片,请访问https://github.com/cunxi1992/private_news,文件夹original_prank。
假如关于代码中的部分完成和句子有疑问,例如,为什么要切换作业目录?能够翻到后边看附录,附上了代码的完成进程。假如理解的,就不用看了。
4. 用到的库和办法
1. os文件
os文件的其他办法请检查os文档,地址:https://docs.python.org/3.6/library/os.html
2. os.listdir()
办法用于返回指定的文件夹包含的文件或文件夹称号的** 列表 ** 。
3. translat()
字符串函数translat()接纳2个参数,第一个参数是一个数据表,其能将一个字符集转译程另一个字符集,咱们这儿不需求,因而能够运用关键字None。第二个参数是一个列表,包含了咱们想要从字符串中移除的一切字符,这儿指的是那些数字,也就是0-9
请点击此处输入图片描述
4. os.getcwd()
该办法返回当时作业目录。
5. os.chdir()
该办法改动当时的作业目录
5. 附录:具体完成进程
思考怎么编写这个程序呢?需求几个进程?其实就两个进程:
1. 翻开文件夹,并获取文件的文件称号
2. 给这些文件重命名,去除文件称号中的数字
1. 翻开文件夹,并获取文件的文件称号
咱们Google一下怎么获取文件中的文件称号,发现有一个os模块的listdir()可用,
# -*- coding:utf-8 -*-
# 导入 os 模块
import os
def rename_files():
'''
函数用于获取文件的文件称号,并去除文件称号中指定的数字
'''
# 第一步:从文件夹获取文件的文件称号
rename_list = os.listdir(r"/Users/cunxi/Python_Project/private_news/prank")
print(rename_list)
# 第二步:针对每一个文件的文件称号,去除数字,对其重新命名
rename_files()
打印输出,证明os.listdir()是否可用:
['68pune.jpg', '45ithaca.jpg', '47london.jpg', ...]
尽管输出成果不是那么美观,但确实证明os.listdir()可用。
下面,咱们开始做第二步,去除文件称号中的数字,给文件称号重命名。
2.给这些文件重命名,去除文件称号中的数字
咱们检查os文档,有一个叫rename(src,dst,src_dir_fd=None, dst_dir_fd=None)函数,它能够读取文件的来历或许当时称号,并将其改为方针地址或更改为新的称号。
咱们要给50张相片重命名,因而这儿要用到for循环:
# -*- coding:utf-8 -*-
# 导入 os 模块
import os
def rename_files():
'''
函数用于获取文件的文件称号,并去除文件称号中指定的数字
'''
# 第一步:从文件夹获取文件的文件称号
rename_list = os.listdir(r"/Users/cunxi/Python_Project/private_news/prank")
# 第二步:针对列表中每一个文件的文件称号,去除数字,对其重新命名
for rename_file in rename_list:
os.rename(rename_file,rename_file.translate(None,'0123456789'))
rename_files()
rename_file 是文件的原始称号,rename_file.translate(None,'0123456789')是去除文件称号中的数字,以达到重命名的目的。
字符串函数 translat() 接纳2个参数,
第一个参数是一个数据表,其能将一个字符集转译程另一个字符集,咱们这儿不需求,因而能够运用关键字None。
第二个参数是一个列表,包含了咱们想要从字符串中移除的一切字符,这儿指的是那些数字,也就是0123456789
运行上述代码:
Traceback (most recent call last):
File "/Users/cunxi/Python_Project/private_news/private_news.py", line 17, in
rename_files()
File "/Users/cunxi/Python_Project/private_news/private_news.py", line 14, in rename_files
os.rename(rename_file,rename_file.translate(None,'0123456789'))
OSError: [Errno 2] No such file or directory
错误显现找不到文件,显现是os.rename()呈现了问题,可能是咱们在重命名文件称号时,程序浏览的文件夹中找不到要命名的文件。
大白话解说就是:程序想对列表rename_list中文件称号为ABC进行重命名,所以在当时作业目录找这个文件,但是却找不到。有必要找到要重命名文件的文件夹才能给文件重命名。
因而,咱们获取下当时的作业目录看一下,看当时的作业目录和要重命名文件的作业目录是否相同。
os.getcwd()办法获取当时的作业目录:
# -*- coding:utf-8 -*-
# 导入 os 模块
import os
def rename_files():
saved_path = os.getcwd()
# 打印作业目录
print('当时的作业目录是:' + saved_path)
rename_files()
成果显现作业目录是:
当时的作业目录是:/Users/cunxi/Python_Project/private_news
而咱们要重命名的文件在 /Users/cunxi/Python_Project/private_news/prank,两个目录不相同,程序在文件夹private_news中找不到要命名的文件,所以程序才报错。
为了解决这个问题,需求将当时的作业目录 切换至 /Users/cunxi/Python_Project/private_news/prank,能够运用办法os.chdir()。
# -*- coding:utf-8 -*-
# 导入 os 模块
import os
def rename_files():
'''
函数用于获取文件的文件称号,并去除文件称号中指定的数字
'''
# 第一步:从文件夹获取文件的文件称号
rename_list = os.listdir(r"/Users/cunxi/Python_Project/private_news/prank")
# 获取当时的作业目录
saved_path = os.getcwd()
# 打印作业目录
print('当时的作业目录是:' + saved_path)
# 切换当时的作业目录至要命名文件的地点目录
os.chdir(r'/Users/cunxi/Python_Project/private_news/prank')
# 第二步:针对列表中每一个文件的文件称号,去除数字,对其重新命名
for rename_file in rename_list:
# 打印重命名前的文件的文件称号
print("原始文件称号:" + rename_file)
# 去除文件称号中的数字,对其重命名
os.rename(rename_file,rename_file.translate(None,'0123456789'))
# 打印重命名后的文件的文件称号
print("重命名后的文件称号:" + rename_file.translate(None,'0123456789'))
# 履行函数
rename_files()
在输出区能够看到输出成果,返回到之前的文件夹中,检查文件,发现现已被成功重命名。
领取专属 10元无门槛券
私享最新 技术干货