如何用python从文中获取文件名再用正则表达式批量修改文件名

第零步:问题的提出

我在网上购买了星火英语的六级晨读美文100篇(六级早已高分飘过,不过很喜欢这些文章,买来重新品味),但是发现其文章的命名都为01.txt或10.txt等。为了便于检索需要修改文件名称。

第一步:从文件中取出文件名。

我发现txt文件的第一行为文件名,格式为如:Passage 3. Three Passions I Have Lived for, 后面还有几个换行符。写下如下代码进行第一步修改:

import os
x = 1
while x < 101:
    if x < 10:
        file_name = "0"+str(x) + ".txt" #10一下则前面补零
        file = open(file_name)
    else:
        file_name = str(x) + ".txt"
        file = open(file_name)
    line = file.readline()
    file.close()
    os.rename(file_name,line) #重命名
    x = x + 1

修改后文件名如下:

我发现这样也不好,因为文件名太长,移到window系统下出现错误;而且在linux下无法读取。所以我要把前面没有用的东西去掉只留下文章的名字。

第二步,修改文件名

代码如下:

import re
import os
import shutil
import time

dir = "/home/leo/Documents/starfire100_2/" #文件目录

if os.path.isdir(dir): #检验目录是否有误
        print ("Directory exists!")
else:
        print ("Directory not exist.")
        time.sleep(5)
        exit()
filelist=[]

filelist=os.listdir(dir)
#print filelist

for i in filelist:
        tt_match = re.search(r'Passage\s{1,2}\d{1,3}\.?\s(.*)\n$',i) #匹配文件名,返回括号内的文章名
        if tt_match:
            NewFile = tt_match.group(1) #获取匹配名存为newfile
            NewFile=i.replace(i,NewFile) # 修改
            shutil.move(dir+i,dir+NewFile) #执行修改

第三步:手工修改

修改后运行

ls | grep 'Passage'

还有如下条目:

去除最后一条属于目录所以还有三条未得到修改,不过数量不多,手动修改解决。

得到如下效果:

第四步:去除换行符replace空格

将上面的代码修改一下以后得到如下代码

import re
import os
import shutil
import time

#dir=raw_input("please input which Directory-Name to Rename:")

dir = "/home/leo/Documents/starfire100_2/"

if os.path.isdir(dir):
        print ("Directory exists!")
else:
        print ("Directory not exist.")
        time.sleep(5)
        exit()
filelist=[]

filelist=os.listdir(dir)
#print filelist

for i in filelist:
        NewFile = i.strip('\n') #去除掉最后那个回车符
        NewFile = re.sub(r'\s+','_',NewFile) #把所有的空格改为下划线
        if NewFile[-1]=='_': #如果最后一个字符为下划线则去除
            NewFile = NewFile[:-1] #去除最后一个下划线
        shutil.move(dir+i,dir+NewFile)

得到如下效果,总算完成了

其实最后去除空格和回车符的代码可以加入修改文件名的代码之中,不过这个很容易就不修改了。

后续问题

我想我的解法一定不是最优的,因为只要找到第二个大写字母就可以匹配出来。如果您能告诉我如何实现或者您有更好的方法请多指教,谢谢!

参考博文

Python正则表达式指南

如何用python从文中获取文件名再用正则表达式批量修改文件名,布布扣,bubuko.com

时间: 2024-10-26 06:31:23

如何用python从文中获取文件名再用正则表达式批量修改文件名的相关文章

MFC批量修改文件名工具

1批量修改文件名描述 1.1功能描述 批量修改同一文件夹下文件名字,可以定义一个新名字,后面接着文件从0开始的序号. 1.2所需技术 CFileDialog,CString方法操作得到所需,rename 2批量修改文件名运行流程 3批量修改文件名详细设计 3.1添加文件按钮响应OnAddFile 按下"添加文件"按钮后,打开一个文件对话框objFileDlg.但是要设置objFileDlg最大文件名缓冲区.然后获得第一个文件的起始位置,依次把全部的文件完整名添加到列表控件中,这里列表控

python批量修改文件名

python批量修改文件名 #coding:utf-8 import os # 列出当前目录的所有文件 files = os.listdir('.') for filename in files: # 分割文件名和后缀名 portion = os.path.splitext(filename) # 比较后缀名 if portion[1] == ".mp3": # 修改后缀名 newname = portion[0] + ".m4a" os.rename(filena

python:批量修改文件名批量修改图片尺寸

参考博客:https://www.cnblogs.com/zf-blog/p/7880126.html 功能:批量修改文件名 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # -*- coding:utf-8 -*- # 图像批量重命名 import string import random import os import shutil def rename(path , newname):   #对文件重命名        

JAVA批量修改文件名

今天看传智播客的JAVA视频,每次都是接着以前的看的,今天想找特定的一个视频温习一下,发现下载的视频每个视频的名字都很长,以至于后面能区分的那一部分都被忽略了,刚学了点JAVA,突然想着能不能把文件名前面相同的部分都给去掉,这样后面关于视频所讲内容的那一部分就可以显示出来了.好吧,试一下吧. 想了一下思路,首先应该找到要修改的文件所在的目录,获取要修改文件的文件名,然后得到删除不要的那一部分的文件名,给文件重命名完毕. 鉴于初学,很多地方还不是很懂,于是从网上了查了一段代码. import ja

windows下 批量修改文件名

Windows系统下批量修改文件名的详细步骤 听语音 | 浏览:11135 | 更新:2017-08-06 01:36 | 标签:windows 1 2 3 4 5 6 7 分步阅读 Windows系统下批量修改文件名的详细步骤 工具/原料 Dos命令操作 简单批量修改文件名 1 在Windows系统上批量修改文件名是非常简单的.选择所有的文件,按F2,然后输入一下描述性的文本,按enter键之后,所选的文件会以输入的描述性文字加数字排列. END 多步修改文件名 在任意一个盘中新建一个文件夹,

CMD命令实现批量修改文件名

cmd命令批量修改文件名:  (批量去掉下载电影后的前缀) @echo off for /f "delims=" %%a in ('dir /b/s/a-d [阳光电影www.ygdy8.com].*') do (     set "str=%%~nxa"     setlocal enabledelayedexpansion     ren "%%a" "!str:~20!"     endlocal ) 批量删除文件名特定

Linux中批量修改文件名

有时候我们有一个目录下面的文件名都需要重新命令 如: 以下有十个学生完成的脚本,现在需要将finish改为ing [[email protected] test]# touch student_{01..10}_finish.sh [[email protected] test]# ls student_* student_01_finish.sh  student_03_finish.sh  student_05_f student_02_finish.sh  student_04_finis

shell脚本:批量修改文件名(删除文件名中字符)

shell脚本:批量修改文件名(文件名中添加字符) 上一篇写过批量修改文件名(文件名中添加字符),工作中还存在这样的需求,批量修改文件名,删除文件名中的某些字符: 举例如下:批量改名,删除文件名中多余字符 目录下文件名为如下,要求去掉_finished. stu_102999_1_finished.jpg stu_102999_2_finished.jpg stu_102999_3_finished.jpg stu_102999_4_finished.jpg stu_102999_5_finis

Linux下批量修改文件名(rename)

原文地址: http://blog.csdn.net/sea_shore/article/details/6102437 1.rename命令批量修改文件名, 其实linux下可以使用别的办法来批量修改文件名, 不过rename实在太方便了 比如把所有的表为cdb1_* 修改为cdb_*的在本目录下只需要# rename 'cdb1' 'cdb' * 以前都是写个for循环来做...想想多傻啊, 呵呵 rename还有更多的功能, 建议man rename下 From:http://www.ha