使用循环更改文件名和扩展名
我需要更改一系列文件的名称和后缀。现在的文件名是'tmax.##.txt',我想把它改成'tmax_##.txt'。然后,我还想把.txt的后缀改成.asc。我试过下面的代码,第一个循环按预期工作,生成了'tmax_01'。但是第二个循环运行时,结果却不如我所想,变成了't'。
list_raw = 'tmax.01.txt', 'tmax.02.txt', 'tmax.03.txt'
for i in list_raw:
list_conv = i.replace('.','_')
for i in list_conv:
list_final = i.replace('_txt','.asc')
有没有什么建议?
4 个回答
1
在第一个循环中:
for i in list_raw:
list_conv = i.replace('.','_')
你的 list_conv
里有一个 str
对象。它会包含列表中最后一个元素,并且这个元素会经过适当的替换。
然后在你的第二个循环中:
for i in list_conv:
list_final = i.replace('_txt','.asc')
你只是逐个遍历字符串,这样每次会给你一个字符。最后,list_final
里会包含经过替换后的最后一个字符。
因为 tmax_03_txt
的最后一个字符是 t
,所以你得到了 t
。
如果你想对列表中的每个元素进行替换,可以使用 list comprehension
,并且改变方法的调用方式:
>>> list_raw = ['tmax.01.txt', 'tmax.02.txt', 'tmax.03.txt']
>>> [elem.replace('.', '_').replace('_txt', '.asc') for elem in list_raw]
16: ['tmax_01.asc', 'tmax_02.asc', 'tmax_03.asc']
2
因为你提到的是文件,所以使用 os.path
可能会比较合适,因为接下来你的代码很可能会涉及到处理这些文件或其他文件。(我只是猜测)
os.path.splitext('afile.txt')[0] + '.asc'
结果是
'afile.asc'
3
你在每次循环中只是给变量赋新值。你想做的是从一个已有列表的修改元素中创建一个新列表,这样做最好的方法是用列表推导式。
list_raw = ['tmax.01.txt', 'tmax.02.txt', 'tmax.03.txt']
list_final = [i.replace(".", "_").replace("_txt", ".asc") for i in list_raw]
注意,你可以像我示例中那样一步到位——没有必要两次遍历列表,产生一个中间列表,这样效率不高。
你也可以用i.replace(".", "_", 1)
只替换第一个.
,这样就不用做那种麻烦的处理文件扩展名的方式。不过,我个人会用i[:-4].replace(".", "_") + ".asc"
——也就是说,先用切片去掉已有的扩展名,替换掉.
,然后再加上新的扩展名。
如果扩展名的长度可能会变化,你可能想看看os.path
模块,正如sotapme所建议的那样。