我的代码读取目录并将带有扩展名的文件名存储到列表中。我想要做的是用替换摆脱扩展。但是,它没有保存到列表中。
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']
我做错了什么?
答案 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]