0

我需要更改一系列文件的名称和扩展名。这些名称目前是“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

4 回答 4

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"——即用切片将现有的扩展名剪掉,替换掉.s,然后添加新的扩展名。

如果扩展的长度可能会有所不同,您可能需要按照sotapmeos.path的建议查看模块。

于 2013-02-02T19:36:20.500 回答
2

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

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

'afile.asc'
于 2013-02-02T19:40:09.627 回答
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_txtt,这就是你得到的原因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']
于 2013-02-02T19:41:03.357 回答
0

或者,您可以使用字符串方法 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 表示只有最右边的 '.' 将作为分割点。

于 2013-02-02T22:37:14.710 回答