Python替换不使用list

时间:2010-12-31 09:15:34

标签: python string replace

我的代码读取目录并将带有扩展名的文件名存储到列表中。我想要做的是用替换摆脱扩展。但是,它没有保存到列表中。

 print projectFilenames

 for f in projectFilenames:
  print f
  f = f.replace('.txt','')
  f = f.replace('.mdown','')
  f = f.replace('.markdown','')
  print f

 print projectFilenames

这是我的输出

  

['2010-10-30-markdown-example.txt','2010-12-29-hello-world.mdown','2011-1-1-tester.markdown']

  2010-10-30 - 降价 - 将example.txt
  2010-10-30-降价-示例
  2010-12-29问候,world.mdown
  2010-12-29问候世界
  2011-1-1 - tester.markdown
  2011-1-1测试仪
  ['2010-10-30-markdown-example.txt','2010-12-29-hello-world.mdown','2011-1-1-tester.markdown']

我做错了什么?

5 个答案:

答案 0 :(得分:6)

列表不会更改,因为您没有更新它。你没有以任何方式触及projectFilenames列表(也没有列出列表中的字符串.Python变量不是指针)这是一种方法:

newlist = []
for f in projectFilenames:
    f = f.replace('.txt','')
    f = f.replace('.mdown','')
    f = f.replace('.markdown','')
    newlist.append(f)

projectFilenames = newlist

另外,看一下os.path模块,那里有一些功能可以切断文件扩展名。 os.path.splitext()具体来说。所以另一种方法是:

newlist = []
for f in projectFilenames:
    f = os.path.splitext(f)[0]
    newlist.append(f)

projectFilenames = newlist

反过来可以简化为(并符合PEP 8):

>>> import os
>>> project_filenames = ['2010-10-30-markdown-example.txt', '2010-12-29-hello-world.mdown', '2011-1-1-tester.markdown']
>>> project_filenames = [os.path.splitext(f)[0] for f in project_filenames]
>>> project_filenames
['2010-10-30-markdown-example', '2010-12-29-hello-world', '2011-1-1-tester']

答案 1 :(得分:4)

您要替换f对象而不是projectFileNames,请执行此操作;

>>> [x.split(".")[0] for x in projectFileNames]
['2010-10-30-markdown-example', '2010-12-29-hello-world', '2011-1-1-tester']

删除扩展程序。

答案 2 :(得分:4)

使用列表理解

列表切片替换(更新原始列表的内容):

l[:] = [f.replace('.txt','').replace('.mdown','').replace('.markdown','') for f in l]

splitext (由@lennart,@ sukhbir建议)

import os
l[:] = [os.path.splitext(f)[0] for f in l]

使用枚举:

import os
for idx, filename in enumerate(l):
    newfilename = os.path.splitext(filename)[0]
    if newfilename != filename:
        l[idx] = newfilename

轶事:splitext()[0], str.replace('.txt') and str.split('.txt')[0]如果原始字符串没有扩展名或匹配则返回原始字符串。 (至少在Python 2.6中)

答案 3 :(得分:2)

正如其他答案中所提到的,文件名列表不会更改的原因是因为您的代码不会更改它。有很多方法可以解决这个问题,包括建立一个新的清单并用它替换原始清单。

我认为最简单的方法是在迭代其元素时修改列表(但是在执行此操作时必须小心,不要修改尚未看到的列表部分)。 Python有一个名为enumerate()的内置函数,它使这种任务易于编码。 enumerate()做的是返回一个“迭代器”对象,它从序列中提供每个项目时计算项目 - 因此计数也是该序列中项目的索引,必要时该索引可用于更新相应的列表元素。

由于您的代码处理文件名,因此可以通过使用可用于处理路径和文件名的名为os.path的内置模块来进一步改进。该模块具有splitext()功能,用于将文件名分为两部分,即“根”和扩展名。它在文档中称为root而不是filename,因为它可以在其上添加目录路径信息。

如果您的代码是使用enumerate()os.path.splitext()重写的,则可能如下所示:

import os
projectFilenames = ['2010-10-30-markdown-example.txt',
                    '2010-12-29-hello-world.mdown',
                    '2011-1-1-tester.markdown']

for i,f in enumerate(projectFilenames):
    root,ext = os.path.splitext(f)
    if ext in ('.txt', '.mdown', '.markdown'):
        projectFilenames[i] = root  # update filename list leaving ext off

print projectFilenames
# ['2010-10-30-markdown-example', '2010-12-29-hello-world', '2011-1-1-tester']

如果您想删除所有文件扩展名,而不仅仅是特定文件扩展名,您只需将if ext in ('.txt', '.mdown', '.markdown'):更改为if ext:

答案 4 :(得分:1)

对文件的此类操作应始终使用os.path.splitext完成。因为它更易于维护,便携,而且您不必重新发明轮子。

>>> os.path.splitext('/home/Desktop/foo.py')[0]
'/home/Desktop/foo'

所以说你有一个列表x,其中包含所有文件:

[os.path.splitext(files)[0] for files in x]