方案::我有一个包含多个文件名的字符串列表。我试图用每个名称的一部分创建一个新列表,或者编辑原始列表以仅包含我想要的部分。例如:
列表的第一项:
"iteration5_test1_part1.txt"
想要的结果:
"iteration5"
(基本上我只想保留第一个下划线之前的内容)
尽管我在这里How to modify list entries during for loop?中读到,编辑列表不是一个好习惯,但我不知道其他方法可以执行此操作,因此我正在尝试:
mypath = "/DGMS/Destop/uploaded"
from os import listdir
from os.path import isfile, join
onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]
for f in onlyfiles:
f = f.split("_")
f = f[0]
但是不幸的是,这并没有以想要的方式更改列表。
问题:我在做什么错了?
答案 0 :(得分:3)
for循环将名称f
绑定到列表中的各个字符串,然后循环主体简单地重新绑定了该名称。这根本不会影响列表,它只是将名称绑定到您创建的新字符串,然后在进入下一个循环迭代之前将其丢弃。我建议阅读this article by Ned Batchelder,以获得有关Python名称和分配如何工作的更深入的说明。
最简单的解决方案是改为使用列表理解:
onlyfiles = [name.split("_")[0] for name in onlyfiles]
答案 1 :(得分:2)
Python中的字符串是不可变的,这意味着它们不能就地修改。
您将不得不将修改后的字符串重新分配给列表。
L = ["iteration5_test1_part1.txt"]
for index, item in enumerate(L):
L[index] = item.split('_')[0]
print(L) # ['iteration5']
或作为列表理解:
L = [item.split('_')[0] for item in L]
答案 2 :(得分:1)
mypath = "/DGMS/Destop/uploaded"
from os import listdir
from os.path import isfile, join
onlyfiles = [f.split("_")[0] for f in listdir(mypath) if isfile(join(mypath, f))]
答案 3 :(得分:1)
也许
for i in range(len(onlyfiles)):
temp = onlyfiles[i].split("_")[0]
onlyfiles[i]=temp
会有所帮助。
答案 4 :(得分:1)
使用分隔符分割字符串很简单。
>>> [s.split('_')[0] for s in l]
#driver值:
IN : l = ["iteration5_test1_part1.txt", "hello_world", "abc_"]
OUT : ['iteration5', 'hello', 'abc']
答案 5 :(得分:1)
您可以执行此操作以创建新列表
mypath = "/DGMS/Destop/uploaded"
from os import listdir
from os.path import isfile, join
onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]
new_list = []
for f in onlyfiles:
f = f.split("_")
new_list.append(f[0])