Python替换无法与lis工作

2024-10-01 15:32:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我的代码读取一个目录,并将带有扩展名的文件名存储到一个列表中。我想做的是用替换来去掉扩展。但是,它没有保存到列表中。在

 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-markdown-example.txt
2010-10-30-markdown-example
2010-12-29-hello-world.mdown
2010-12-29-hello-world
2011-1-1-tester.markdown
2011-1-1-tester
['2010-10-30-markdown-example.txt', '2010-12-29-hello-world.mdown', '2011-1-1-tester.markdown']

我做错什么了?在


Tags: 代码目录txthello列表forworld文件名
3条回答

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

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

由于您的代码处理的是文件名,因此可以通过使用名为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:。在

列表不会更改,因为您没有更新它。您没有以任何方式接触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.splitext操作系统()具体来说。另一种方法是:

^{pr2}$

反过来可以简化为(并使其符合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']

您正在替换f对象,而不是projectFileNames,请这样做

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

删除扩展名。在

相关问题 更多 >

    热门问题