使用循环更改文件名和扩展名

0 投票
4 回答
2052 浏览
提问于 2025-04-17 14:33

我需要更改一系列文件的名称和后缀。现在的文件名是'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所建议的那样。

撰写回答