我正在尝试过滤出出现在for循环中的文件名中的字符串
if search == "List":
onlyfiles = [f for f in listdir("path") if isfile(join("path", f))]
for i in onlyfiles:
print(i)
现在它将按预期和期望的方式输出所有文件名,但是我想过滤掉文件末尾的.json以及文件名中的其他一些元素,以便我可以看到文件名。
例如:filename-IDENTIFIER.json 我想从for循环的输出中过滤掉“ -IDENTIFIER.json”
感谢您的帮助
答案 0 :(得分:2)
根据您的数据可以变化的多少,这里有几种方法:
因此,让我们尝试构建一个get_filename(f)
方法
如果您知道f
总是以完全相同的方式结束,那么您可以直接尝试删除这些字符。因此,这里我们必须删除最后16个字符。知道在Python中将字符串视为一个(不可变的)字符数组很有用,因此您也可以使用列表索引。
get_filename(f: str):
return f[:-16]
但是,如果标识符或后缀的长度发生变化,这将失败。
如果后缀根据长度而变化,那么您应该在固定的定界符上分割字符串并返回相关部分。在这种情况下,您想在-
上进行拆分。
get_filename(f: str):
return f.split("-")[0]
但是请注意,如果文件名还包含-
,则此操作将失败。
您可以通过以下方法删除最后一部分并重新加入所有先前的部分来解决此问题。
get_filename(f: str):
return "-".join(f.split("-")[:-1])
最通用的方法是使用python regexes选择相关部分。这些使您可以非常具体地针对特定模式。所需的确切正则表达式将取决于字符串的复杂程度。
答案 1 :(得分:0)
将字符串分割为“-”并获取第一个元素:
filename = f.split("-")[0]
如果文件名包含“-”,这将很混乱。
答案 2 :(得分:0)
这应该有效:
i.split('-')[0].split('.')[0]
案例1 :filename-IDENTIFIER.json
它在破折号前使用子字符串,因此输出将变为filename
案例2 :filename.json
字符串中没有破折号,因此第一个拆分不执行任何操作(完整的字符串将在第0个元素中),然后将子字符串带到该点之前。输出将为filename
案例3 :filename
没什么可分割的,输出将为filename
如果始终使用.json
和-IDENTIFIER
,则使用它更安全:
i.split('-IDENTIFIER')[0].split('.json')[0]
案例4 :filename-blabla.json
如果文件名中带有多余的破折号,那将不是问题,输出将为filename-blabla