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

时间:2013-02-02 19:33:57

标签: python

我需要更改一系列文件的名称和扩展名。名称目前为'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 个答案:

答案 0 :(得分:2)

您只是在循环的每次迭代中为变量分配新值。您要做的是从现有列表的修改元素创建一个新列表,最好使用list comprehension

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" - 也就是说,使用切片切断现有扩展,替换.,然后添加新扩展。

如果扩展程序的长度可能不同,您可能需要按照sotapme的建议查看os.path模块。

答案 1 :(得分:2)

因为您正在谈论文件,所以使用os.path可能是值得的,因为代码的下一部分可能是操纵这些或其他文件。 (只是猜测)

os.path.splitext('afile.txt')[0] + '.asc'

给出

'afile.asc'

答案 2 :(得分:1)

在第一个循环中: -

for i in list_raw:
    list_conv = i.replace('.','_')

您的list_conv包含str个对象。它将包含列表中的最后一个元素,并带有相应的替换元素。

然后在你的第二个循环中: -

for i in list_conv:
    list_final = i.replace('_txt','.asc')

你只是迭代字符串序列,一次只能给你1个字符。 list_final将包含完成相应替换的最后一个字符。

由于tmax_03_txt中的最后一个字符为t,因此您获得了t


如果要对列表的每个元素进行替换,则可以使用list comprehension和方法调用的chaning: -

>>> 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']

答案 3 :(得分:0)

或者,您可以使用string method rsplit

list_raw = ['tmax.01.txt', 'tmax.02.txt', 'tmax.03.txt']
list_final = [filename.rsplit('.',1)[0] + '.ext' for filename in list_raw]

ext是新扩展名。 rsplit()中的1表示只有最右边的'。'将作为分裂点。