当目标字符串包含在列表中时,str.replace似乎无法正常运行

时间:2016-08-21 04:10:44

标签: python python-3.x

在我的程序中,我有一段代码,可以在我的计算机目录中查找pickle文件,并使用列表解析将其名称放入列表中。在此之后,我试图删除" .pickle"由于此处无需解释的原因,文件扩展名来自列表中的每个文件名。但是,在遍历列表并重新定义每个元素之后,将其重新定义为传递到str.replace内置函数并替换" .pickle"使用""的字符串,列表中的名称似乎没有更改。这是我的代码:

import os
file_names = [file for file in os.listdir("C:/~~/dir") if file.endswith(".pickle")]
for each in file_names:
    each = each.replace(".pickle","")

我在程序开发的早期阶段使用的一个pickle文件是目录中的唯一文件。
该计划没有错误。

文件本身的名称称为" debugger.pickle"当打印" file_names"列出它打印

['debugger.pickle']

而不仅仅是

['debugger']

这是我想要的结果。

2 个答案:

答案 0 :(得分:3)

each = each.replace(".pickle","")创建一个新字符串并将其绑定到名称each。这对file_names中的原始字符串对象没有影响。

如果.replace方法就地改变了它的字符串,那么

for each in file_names:
    each.replace(".pickle","")

可以工作,但是代码实际上并不会做你想要的,因为Python字符串是不可变的。

所以你需要保存已修剪的字符串,这样做的简单方法是使用列表理解:

file_names = [each.replace(".pickle","") for each in file_names]

请注意,这会将原始file_names列表对象替换为新对象。如果您想改为修改原始file_names对象

file_names[:] = [each.replace(".pickle","") for each in file_names]

效率稍低(而且速度较慢),但如果您有其他对象引用原始file_names对象,它会很有用。

答案 1 :(得分:0)

您不能替换内联物品;尝试使用map或list comprehension重新创建列表:

import glob
import os

original_files = glob.glob(r'C:/foo/blah/*.pickle')
files = [os.path.basename(os.path.splitext(i)[0]) for i in original_files]

你也可以把它结合起来:

files = [os.path.basename(os.path.splitext(i)[0]) for i in glob.iglob(r'C:/foo/*.pickle')]