在我的程序中,我有一段代码,可以在我的计算机目录中查找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']
这是我想要的结果。
答案 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')]