我有一个文件夹,其中包含多个文件,以下是文件名,我有多个不同的此类
_EGAZ00001018697_2014_ICGC_130906_D81P8DQ1_0153_C2704ACXX.nopd.AOCS_001_ICGCDBDE20130916001.rsem.bam
现在,我想重命名,然后仅使用ICGCDBDE20130916001.rsem.bam
使用,将根据路径中的文件更改。对应于名称 *.rsem.bam的字符串应为" _"分隔的字符串。因此,对于目录中的所有文件,都应相应地替换。我正在考虑使用正则表达式,所以我想出了以下模式
pat=r'_(.*)_(.*)_(.*)_(.*)_(.w+)'
这将根据需要将我的文件名分开,我可以使用仅服用pat[4]
的全局变量来重命名文件名。我想使用python,因为我现在想学习它,以在文件重命名时进行小型更改,依此类推,随着时间的流逝,随着时间的流逝,请转换我的工作流程。我无法做到。我应该如何在Python中完成这项工作?还可以解决应该是相应的bash正则是一个很大的文件名,而且我与此类相遇非常新。以下是我的代码不是直接更改,而是要了解它是否有效,但是如果我想重命名它们,我该如何工作。
import re
import os
_src = "path/bam/test/"
_ext = ".rsem.bam"
endsWithNumber = re.compile(r'_(.*)_(.*)_(.*)_(.*)_(.w+)'+(re.escape(_ext))+'$')
print(endsWithNumber)
for filename in os.listdir(_src):
m = endsWithNumber.search(filename)
print(m)
我都会感谢Python和Bash中的同时,我希望Python自己的理解和未来的学习。
您可以使用rpartition
,将所需的零件从其余部分分离到三部分元组。
给定:
>>> fn
'_EGAZ00001018697_2014_ICGC_130906_D81P8DQ1_0153_C2704ACXX.nopd.AOCS_001_ICGCDBDE20130916001.rsem.bam'
您可以做:
>>> fn.rpartition('_')
('_EGAZ00001018697_2014_ICGC_130906_D81P8DQ1_0153_C2704ACXX.nopd.AOCS_001', '_', 'ICGCDBDE20130916001.rsem.bam')
然后:
>>> _,sep,new_name=fn.rpartition('_')
>>> new_name
'ICGCDBDE20130916001.rsem.bam'
如果您想使用正则:
>>> re.search(r'_([^_]+$)', fn).group(1)
'ICGCDBDE20130916001.rsem.bam'
实际上,您将测试在使用组(1)之前是否有匹配:
>>> m=re.search(r'_([^_]+$)', fn)
>>> new_name = m.group(1) if m else fn
对于sed
,您可以做:
$ echo "$fn" | sed -E 's/.*_([^_]*)$/1/'
ICGCDBDE20130916001.rsem.bam
或bash,同一正则是:
$ [[ $fn =~ _([^_]*)$ ]] && echo "${BASH_REMATCH[1]}"
ICGCDBDE20130916001.rsem.bam
您可以使用列表理解
import re
import os
_src = "path/bam/test/"
new_s = [re.search("[a-zA-Z0-9]+.rsem.bam", filename) for filename in os.listdir(_src)]
for first, second in zip(os.listdir(_src), new_s):
if second is not None:
os.rename(first, second.group(0))
工作太多。
newname = oldname.rsplit('_', 1)[1]
import os
fname = 'YOUR_FILENAME.avi'
fname1 = fname.split('.')
fname2 = str(fname1[0]) + '.mp4'
os.rename('path to your source file' + str(fname), 'path to your destination file' + str(fname2))
fname = fname2