非程序猿上手python系列-实战之批量修改文件名(四)

前言

  1. 知道如何写,比写本身更重要
  2. 会读代码,比写代码更重要

前面的教程说过,程序实际就是对数据进行操作。我们可以把一切程序划分为三种行为:

  1. 读取数据
  2. 创造/修改数据
  3. 保存数据

首先我们应该知道,程序是运行在计算机内存中的。那么读取数据实际就是将数据加载到内存的过程。修改也是在内存中操作,而保存数据就是一个写回硬盘的过程。保存数据的过程我们也称之为持久化。

编写一个程序,有固定的几个步骤

  1. 明确需求并进行步骤拆分
  2. 能不能做?如何做?
  3. 写代码,调试(验证是不是正确的)

关于1,有个经典的栗子
需求:如何把大象装进冰箱
步骤拆解:

  1. 打开冰箱门
  2. 把大象塞进冰箱
  3. 关上冰箱门

关于搜索
百度你可能经常用,但是我发现还是很多人经常找不到自己想要的东西。
我推荐关键词搜索法

  1. 不要直接搜一个长句
  2. 提取关键字,空格隔开再搜索
    比如: 你要搜索的是python如何批量修改文件
    关键字:windows python3 批量修改文件

搜索后还要对结果进行筛选

  1. 有代码的优先
  2. 有教程的优先
  3. 技术博客类网站优先

需求描述

现在有如下文件结构

target
├── xxx_我的文件1.txt
├── xxx_我的文件2.txt
└── xxx_我的文件3.txt

target : 文件夹名字

你需要把文件名中 xxx_ 去掉

需求拆解

  1. 拿到文件名(读取数据)
  2. 删掉 xxx_
  3. 保存文件

ps: 这需求过于简单,你可以直接搜 “windows python3 批量修改文件” 就能拿到结果。这里只是为了演示如何拆解需求。

经过需求拆解。发现这三点,前面的教程都没有提到过啊!怎么办?
当然是面向百度编程

拿到文件名

关键词: python3 获取文件名
假设你找到了这篇 https://www.jianshu.com/p/129fa0893adc
注意: 有时候搜索到的代码不一定能运行,你需要自己尝试,是否符合预期

里面提到了几个概念

  1. os模块
  2. os.walk 方法
  3. os.listdir 方法

我们在学习的时候,注重的是如何使用。不要一开始就最求去了解人家是怎么实现的。
函数:我们只需要关注,输入是什么,输出是什么

扩展学习法(可选):比如,这里认识了os模块,那么我们可以去搜索这个模块还提供了什么方法。
关键字:python3 os模块
推荐https://www.runoob.com/python3/python3-os-file-methods.html

其他方法我就不介绍了。
我们只需要用os.listdir
参考: https://www.runoob.com/python3/python3-os-listdir.html

功能:返回指定的文件夹包含的文件文件夹的名字的列表
注意:

  1. windows 和 Linux 表示文件路径的写法是不一样的, 教程中的是linux 的写法
  2. 路径中最好不要有中文
  3. 相对路径和绝对路径
    相对路径:相对当前目录来描述文件路径
    绝对路径:从根目录开始描述,windows 从某个盘开始描述

预备操作:

  1. 在你喜欢的地方创建一个lesson_2文件夹
  2. 在lesson_2 文件夹下创建一个target文件夹,并按需求在target创建多个文件
  3. 在lesson_2 文件夹下创建一个move_file.py 用来编写代码
    测试
# windows
# path = "D:\\data\\lesson_2\\target" 
# linux
path = '/data/lesson_2/target' # 需要修改为你的target文件夹路径
dirs = os.listdir(path)
for dir in dirs:
    print(dir)  # python2 的print是语句,不是函数,所以不需要加括号

运行程序

Traceback (most recent call last):
  File "move_file.py", line 2, in <module>
    dirs = os.listdir(path)
NameError: name 'os' is not defined

出现这样的情况,恭喜你,代码报错了。
代码报错是编程中常见的一个现象。先不要苦恼,学习解决报错也是必备知识

Traceback (most recent call last):            # 这一行是告诉你,报错了。 
  File "move_file.py", line 2, in <module>    # 这行告诉你, "move_file.py" 文件的第二行报错了 
    dirs = os.listdir(path)                   # 这里显示 "move_file.py" 第二行代码是什么
NameError: name 'os' is not defined           # 这行是最重要的, "NameError" 是错误类型, "name 'os' is not defined" 是错误描述

如果你读不懂英文,没关系,http://fanyi.baidu.com
一般我们搜索错误描述,都会有解决方案
这里的错误描述说的是: os 没有定义,也就是说,解释器不知道os是什么东西
思考过程:
我们预期的os应该是个模块的名称
所以,需要先导入

修改后的代码:

# -*- coding:utf-8 -*-
import os  # 加载os模块

path = '/data/lesson_2/target' # 定义path变量,并赋值。值的类型为字符串,内容为target文件夹路径  
dirs = os.listdir(path)        # 调用os模块的listdir 方法,传入一个参数,path(上一行定义的); 函数的返回值赋值给dirs
print(dirs)                    # 如果你想看listdir 返回的值是什么,就打印它
for dir in dirs:               # 遍历dirs, 取出每个值,每取出一次就赋值给dir
    print(dir)                 # 打印dir

第一行我添加了# -*- coding:utf-8 -*- 看起来是个注释,实际上是告诉解释器代码的编码方式。
如果你不知道什么叫编码方式,没关系,以后写python代码,你只需要把这个粘贴到第一行就好了。

如果不写,有的童鞋可能会因为代码中有中文而报错。
还有,确保你编辑器选择的是utf-8编码方式,vscode在界面的右下方
在这里插入图片描述
如果不是可以点击切换

运行结果

 ['xxx_我的电影2.mp4', 'xxx_我的电影3.mp4', 'xxx_我的电影1.mp4']
xxx_我的电影2.mp4
xxx_我的电影3.mp4
xxx_我的电影1.mp4

第一行是print(dirs)的结果,也就是说,os.listdir函数返回的是一个列表,列表中的元素为文件名

到这里,我们相当于拿到了,文件名。

修改文件名

修改文件名,在这里本质上就是修改一个字符串。
如何想扩展字符串,相关的知识。可以浏览https://www.runoob.com/python3/python3-string.html
基础操作:

# 拼接
str1 = "hello"
str2 = "world"
print(str1+str2) # "helloworld"

# 替换
str3 = "xxx_我的电影2.mp4"
str4=str3.replace("xxx_", "")  # string类型内置了replace方法。第一个参数为要替换的字符串,第二个参数为替换的内容。这里的含义是,将str3中的'xxx_' 替换成空字符串 ''
print(str4) # 输出 "我的电影2.mp4"

# 截取 
str5 = "0123456789" # 这里是类型是字符串,不是数字。
print(str5[1:3]) #  输出 "12"         含义:从第2字符个截取到第3个
print(str5[:6])  #  输出 "012345"     含义:从第1字符个截取到第6个
print(str5[5:])  #  输出 "56789"      含义:从第6字符个截取到最后
print(str5[:])   #  输出 "0123456789" 含义:从头截取到尾巴
# 总结:str[a:b]中,a,b是字符的位置,从0开始数,不包括b , 所以截取的位置为从a+1,到b的字符

# 取值
print(str5[0]) # 取字符串中第一个字符:0
print(str5[1]) # 取字符串中第二个字符:1
print(str5[-1] # 取字符串中最后一个字符:9

知识积累完毕,我们继续最初的需求:
xxx_我的电影1.mp4 修改为 我的电影1.mp4
根据上面提到的,我们至少可以想到两个方法。

  1. 使用replace方法
  2. 截取字符串
    截取字符串留作你的练习题。我们用replace方法实现
# -*- coding:utf-8 -*-
import os  # 加载os模块

path = '/data/lesson_2/target'
dirs = os.listdir(path)
for dir in dirs:  # 每次循环,dir就是一个文件名
    dir = dir.replace("xxx_", '') # 替换'xxx_' 为空
    print(dir)

运行结果

我的电影2.mp4
我的电影3.mp4
我的电影1.mp4

保存

保存又是我们的知识盲点。又要百度啦~

这里说保存可能会有歧义。所以如果你去搜:python3 保存文件名
可能会搜不到想要的结果。我们需要区分,我们改动的是文件名,而不是文件内容。
所以,我们应该是搜索:python3 修改文件名
又要假设你搜到了https://www.runoob.com/python3/python3-os-rename.html
其实,如果上面你有去学习os模块,那么也会了解到这个方法。

rename()方法语法格式如下:
os.rename(src, dst)
src – 要修改的目录名
dst – 修改后的目录名

注意,参数是目录名(应该叫路径),而不是文件名。如果你写的是文件名,就会认为你写的是相对路径。
我们写的代码里,dir 代表的是文件名。所以还应该拼接上文件名,才能作为rename的参数。
拼接字符串,你可以使用+号,但是,如果考虑到兼容的问题,我这里使用os.path.join()方法。
代码:

# -*- coding:utf-8 -*-
import os  # 加载os模块

path = '/data/lesson_2/target'
dirs = os.listdir(path)
for dir in dirs:  # 每次循环,dir就是一个文件名
    # 注意,我这里修改了接收值的函数名,因为我们还要用到dir,不能修改dir的值
    new_file = dir.replace("xxx_", '')

    old_file_path = os.path.join(path, dir)
    new_file_path = os.path.join(path, new_file)

    os.rename(old_file_path, new_file_path)

运行结果:
target 目录下文件的名称改变了。

target
├── 我的电影1.mp4
├── 我的电影2.mp4
└── 我的电影3.mp4

总结

  1. 重点不在与案例本身,而是我们如何通过搜索一步一步完成这个功能的。
  2. 想一想,什么是需要你记住的,什么是你不需要记住的。千万不要想着把所有的方法,模块都背下来。越往后你会发现,这些东西太多了。
  3. 你能描述os.path.join 函数的功能吗?
  4. 练习题:使用os.walk 函数替换os.listdir, 实现相同的功能
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值