我需要更改一系列文件的名称和扩展名。名称目前为'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')
有什么建议吗?
答案 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表示只有最右边的'。'将作为分裂点。