描述:假设有这样一个任务,你需要将文件名中含有美国风格日期(MM-DD-YYYY)的部分更换为欧洲风格日期(DD-MM-YYYY),并且需要你处理的文件多达上千个

分析:检查当前工作目录的所有文件名,寻找美国风格的日期。如果找到,将改文件改名,交换月份和日期的位置,使之成为欧洲风格

程序需要做以下事情

  1)创建一个正则表达式,可以识别美国风格日期的文本模式

  2)调用 os.listdir() 找出工作目录中的所有文件

  3)循环遍历每个文件名,利用该正则表达式检查他是否包含日期

  4)如果它包含日期,用 shutil.move() 对该文件改名

完整代码如下

#! python3
# renameDates.py - 将带有美国风格日期的文件更名为欧洲风格日期
import os,re #为美国风格日期(MM-DD-YYYY)创建一个正则表达式
def USADateSearch(flodername):
USADateRegex=re.compile(r'''
^(.*?) #匹配文件名的全部
((0|1)?\d) #匹配月份并分组
[-.] #分隔符为.或-
([0-3]?[0-9]) #匹配日期并分组
[-.]
((19|20)\d\d)
(.*?)$
''',re.VERBOSE) return USADateRegex.search(flodername)
#在文件夹中创建文件
#filename-包含多个文件名的列表
#path-保存文件的路径
def creatfile(filename,path):
for filename in filename:
fileAbsPath=os.path.join(path,filename)
fileObj=open(fileAbsPath,'w')
fileObj.close() path=r'C:\\Users\\Administrator.SC-s\\AppData\\Local\\Programs\\Python\\Python37\\forTest'
foldername=['img-11.08.1995.txt','img-2333434.txt','img-21.05.1995.txt',
'img-12.08-1994.jpg','img-12.8.1994.gif','img-01.31.2030.txt',
'img-1.31.2030.jpg','img-05.05.1995.jpg','img-2-2-2011.txt']
#设置当前工作目录(要用绝对路径的话就不用设置了)
os.chdir(path)
#先创建文件,只运行一次,先不要删除
#creatfile(foldername,path)
#定义一个主函数吧
def main():
for filename in os.listdir(path):
mo=USADateSearch(filename)
if mo==None:
print('-'*20)
continue
#这里必须把所有的值给取过来,不能只要月和日
#获得年月日各部分
beforePart=mo.group(1)
monthPart=mo.group(2)
dayPart=mo.group(4)
yearPart=mo.group(5)
afterPart=mo.group(7)
#连接字符串
euroFilename=beforePart+dayPart+'-'+monthPart+'-'+yearPart+afterPart
#获取绝对路径
amerFilename=os.path.join(path,filename)
euroFilename=os.path.join(path,euroFilename)
#重命名文件
print('Renaming "%s" to "%s"...' %(amerFilename,euroFilename))
os.rename(amerFilename,euroFilename)
main()

  

step1:为美国风格日期(MM-DD-YYYY)创建一个正则表达式

  可以根据每个数段的范围来拼写正则表达式,但又出现了一个问题,假如MM和DD的日期相同时可能会匹配到到错的,你不能确定他是欧洲风格还是美国风格,但是仔细思考过后,我只是把它们翻转过来,即是匹配到的是不准确的,但是因为他们相同,翻转后也是相同的

  

 USADateRegex=re.compile(r'''(
^(.*?) #匹配文件名的全部
((0|1)?\d) #匹配月份并分组
[-.] #分隔符为.或-
([0-3]?[0-9]) #匹配日期并分组
[-.]
(19|20)\d\d
(.*?)$
)''',re.VERBOSE)

    step2:识别文件名中日期部分

for filename in os.listdir('.'):
mo=USADateSearch(filename)
if mo==None:
print('-'*20)
continue
#这里必须把所有的值给取过来,不能只要月和日
#获得年月日各部分
beforePart=mo.group(1)
monthPart=mo.group(2)
dayPart=mo.group(4)
yearPart=mo.group(5)
afterPart=mo.group(7)

  step3:构成新文件名,并对文件改名

#连接字符串
euroFilename=beforePart+dayPart+'-'+monthPart+'-'+yearPart+afterPart
#获取绝对路径
amerFilename=os.path.join(path,filename)
euroFilename=os.path.join(path,euroFilename)
#重命名文件
print('Renaming "%s" to "%s"...' %(amerFilename,euroFilename))  #这里面之所以把占位符用双引号括起来,是因为用单引号需要转义,太麻烦
os.rename(amerFilename,euroFilename)  #第一次运行时通常需要将这行注释,用然后检查上一行打印的信息,确认重命名争取了后再运行

遇到的问题:

   管道匹配时句法

可能会存在的缺陷:

  匹配日期的正则表达式有漏洞:如会匹配XXX31.08.1995 未纠正

  调用 shutil.move() 来改名,会不会太浪费了,会造成无用的操作,毕竟我们只需要改变文件名(已解决)

Python组织文件 实践:将带有美国风格日期的文件改名为欧洲风格日期的更多相关文章

  1. Pyhton项目实践:将带有美国风格日期的文件改名为欧洲风格日期

    题目 项目要求:上千个文本文件,文件名包含美国风格的日期( MM-DD-YYYY),需要将它们改名为欧洲风格的日期( DD-MM-YYYY) 先写个创建一百个美国风格日期的文件 #! python # ...

  2. Python组织文件 实践:拷贝某种类型的所有文件

    #! python3 #chapter09-test01- 遍历目录树,查找特定扩展名的文件不论这些文件的位置在哪里,都将他们 #拷贝到一个新的文件夹中 import os,shutil,pprint ...

  3. Python组织文件 实践:将文件的不同版本备份为ZIP文件

    功能:备份文件夹.能将文件的不同版本备份下来,并且每个有不同的名字 #! python3 # backupToZip.py - 备份文件的不同版本到压缩文件中 import zipfile,os #f ...

  4. paip.复制文件 文件操作 api的设计uapi java python php 最佳实践

    paip.复制文件 文件操作 api的设计uapi java python php 最佳实践 =====uapi   copy() =====java的无,要自己写... ====php   copy ...

  5. python实践项目十:zipfile模块-将一个文件夹备份到一个 ZIP 文件

    描述:将指定路径下的某文件夹备份到一个zip文件 代码: #!/usr/bin/python # -*- coding: UTF-8 -*- # backupToZip - Copies an ent ...

  6. 《Python机器学习及实践:从零开始通往Kaggle竞赛之路》

    <Python 机器学习及实践–从零开始通往kaggle竞赛之路>很基础 主要介绍了Scikit-learn,顺带介绍了pandas.numpy.matplotlib.scipy. 本书代 ...

  7. Redis的Python实践,以及四中常用应用场景详解——学习董伟明老师的《Python Web开发实践》

    首先,简单介绍:Redis是一个基于内存的键值对存储系统,常用作数据库.缓存和消息代理. 支持:字符串,字典,列表,集合,有序集合,位图(bitmaps),地理位置,HyperLogLog等多种数据结 ...

  8. Python自动化运维之4、格式化输出、文件对象

    Python格式化输出: Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[P ...

  9. [Python][小知识][NO.5] 使用 Pyinstaller 打包成.exe文件

    1.安装 pyinstaller 插件 cmd命令:pip install PyInstaller PS . o.o 不知道 easy_install 的百度吧. 2.pyinstaller 简介 他 ...

随机推荐

  1. mybatis的sql中使用$会出现sql注入示例

    mybatis的sql中使用$会出现sql注入示例: 模拟简单登录场景: 页面代码: function login(){ //sql注入 var user = { username : "' ...

  2. HD-ACM算法专攻系列(11)——Exponentiation

    问题描述: 源码: 考察对大数的计算,需要注意去除前导0与后导0. import java.math.BigDecimal; import java.util.*; public class Main ...

  3. 时域,频域,s域和z域,一些网上的总结

    https://www.jianshu.com/p/29f4a7663b14 https://wenku.baidu.com/view/26961183b9d528ea81c779e0.html ht ...

  4. [ Linux ] [ OS ] [ CPU ] Linux系統 OS, CPU, Memory, Disk

    查看 linux 版本 及 Kernel 版本 指令: cat /etc/*-release http://benit.pixnet.net/blog/post/19390916-%E5%A6%82% ...

  5. 找出在使用临时表空间的SQL

    SELECT a.username, a.sid, a.serial#, a.osuser, b.tablespace, b.blocks, c.sql_text FROM v$session a, ...

  6. swift语言点评一

    一.变量定义 1.常量与变量 Use let to make a constant and var to make a variable. 2.类型与推测 However, you don’t alw ...

  7. js判断浏览器的环境(pc端,移动端,还是微信浏览器)

    window.navigator.userAgent用来区分设备和浏览器 <!DOCTYPE html> <html> <head> <meta charse ...

  8. iOS开发者中心重置设备列表

    苹果开发者账号允许的测试设备为100台,如果你注册了,这台机器就算是一个名额,禁用也算一个名额,仍被计入机器总数,每年可以重置一次,那我们怎么重置机器数量呢? 我们需要给苹果发送申请: https:/ ...

  9. [Javascript] Transduce over any Iteratable Collection

    So far we've been transducing by manually calling .reduce() on arrays, but we want to be able to tra ...

  10. wsimport 使用方法具体解释

    wsimport 使用方法 本文主要介绍wsimport的简单使用方法.帮助大家在webserviceclient开发过程中生成接口代码: 打开java JDK文件夹我们会看到wsimport工具,这 ...