我正在尝试通过文件列表查找所有excel
,txt
或csv
文件,并将它们附加到列表中
goodAttachments = [i for i in attachments if str(i).split('.')[1].find(['xlsx','csv','txt'])
这显然不起作用,因为find()
需要一个字符串而不是一个列表。我应该在列表理解中尝试列表理解吗?
答案 0 :(得分:4)
无需拆分或使用双列表理解。您可以使用str.endswith
,它使用一个字符串元组作为参数进行检查:
goodAttachments = [i for i in attachments if str(i).endswith(('.xlsx', '.csv', '.txt')))
如果您真的要拆分:
goodAttachments = [i for i in attachments if str(i) if i.split('.')[-1] in ('xlsx', 'csv', 'txt')]
第一种方法更好,因为它可以处理没有扩展名的文件。
答案 1 :(得分:1)
您可以尝试这样的事情:
goodAttachments = [i for i in attachments if str(i).split('.')[-1] in ['xlsx', 'csv', 'txt']]
这将检查扩展名是否位于最后一个'。'之后。完全匹配“ xlsx”,“ csv”或“ txt”之一。
答案 2 :(得分:0)
[i for i in attachments if any([e in str(i).split('.')[1] for e in ['xlsx','csv','txt']]))
就像你说的那样,嵌套列表理解。
编辑:这将不会分裂,我正在尝试在find
中复制逻辑。
答案 3 :(得分:0)
您可以检查第二个列表中是否存在最后一个点之后的所有内容。使用[-1]
而非[1]
可以确保名为like.this.txt
的文件将返回上一个拆分的txt
而不是this
。
goodAttachments = [i for i in attachments if str(i).split('.')[-1] in ['xlsx','csv','txt']]
答案 4 :(得分:0)
我建议也许再增加几行,然后尝试创建具有嵌套列表理解的单行代码。虽然可以,但我认为将这些理解拆分为单独的行将使代码更具可读性。
import os
attachments = ['sadf.asdf', 'asd/asd/asd.xslx']
whitelist = {'.xslx', '.csv'}
extentions = (os.path.split(fp)[1] for fp in attachments)
good_attachments = [fp for fp, ext in zip(attachments, extentions) if ext in whitelist]
我还在os.path.split
上使用了str.split
,因为该文件可能存在多个点,并且此拆分是针对此确切的工作而设计的。