【问题标题】:Issue with returning multiple files along with another variable from a python function从 python 函数返回多个文件以及另一个变量的问题
【发布时间】:2020-07-08 13:58:32
【问题描述】:

我正在编写一个脚本,它将在列表all_files 中搜索模式文件(在列表req_text 中提到)。如果在列表all_files 中找到该模式的文件,则返回True,否则返回false

我正在尝试使用变量 f 返回所有文件,但它只返回 1 个文件,而不是列表 req_text 中提到的所有文件

代码:

all_files = ['amc_20200304.txt', 'hello.py', 'pmc_20190807.txt', 'pmc_20200304.txt', 'pmc_20304.txt']
req_text = ['pmc_20304', 'abc']

# checking for files to be available
def file_check():    
    all_files = os.listdir(dir)
    for r in req_text:
        found = False
        for f in all_files:    
            if r in f:                         
                found = True
                break
        if not found:
            return False
    return f, True
          
# polling to check if file exists or not
def poll_file_check():
    result = file_check()
    print(result) 

输出:

result = ('abc.txt', True)

预期输出:返回所有文件以及另一个变量True

result = [('abc.txt', pmc_20304.txt), True)]

任何帮助将不胜感激,我如何从变量 result 而不是 True 获取仅文件列表

【问题讨论】:

  • 首先你需要true or false在那个函数中是returned吗?您可以简单地将 result 存储为 listfiles-found ,然后在任何需要的地方检查 len(result) true or false
  • 你想要Live-Demo

标签: python python-3.x file


【解决方案1】:

您需要维护某种数据结构(很可能是一个列表),您将在其中添加found 为True 的文件。所以不要只返回f,它只能取一个文件的名称,你应该维护一个你将添加文件的列表。

像这样的

def file_check():
  filtered_files = []
  for r in req_text:
    for f in all_files:
      if r in f:
        filtered_files.append(f)
        break # So you don't add the file again

  return filtered_files, bool(filtered_files)

请注意,使用元组来维护文件名是行不通的,因为tuples are immutable。而且你也不需要维护一个found 变量,因为如果filtered_files 列表有一些内容,你就知道你已经找到了一些东西。

【讨论】:

  • 即使只有 1 个文件,它也会返回列表。我希望仅当列表 req_txt 中提到的所有模式文件都在 all_files 列表中找到时才返回列表
  • 我已经回答了我的问题。后来想通了
【解决方案2】:

您可以使用list-comprehension 轻松完成此操作。只需将您的 function definition 更改为:

def file_check():    
    all_files = od.listdir(dir)
    return [f for f in all_files for r in req_text if r in f]

输出将是:

['abc.txt', 'pmc_20304.txt']

编辑 - 如果你只想检查 are all files of req-text variable in all-files variable? ,该函数可以使用 python 中的 all() 方法:

# checking for files to be available
def file_check():    
    all_files = os.listdir(dir)
    return all([bool(r in all_files) for r in req_text])

【讨论】:

  • 即使只有 1 个文件,它也会返回列表。我希望仅当列表 req_txt 中提到的所有模式文件都在目录中找到时才返回列表
  • 所有方法在哪里?
  • 这将返回问题中已经发生的真或假。我需要所有文件的列表。不管怎样,谢谢你的帮助
  • 你的意思是,如果在all_files 中只找到req_txt 的所有文件,它应该返回完整列表为true。如果没有找到一些文件,它应该返回空列表为false ?
  • 我已经回答了我的问题。后来想通了
【解决方案3】:

这就是答案

def file_check():    
    all_files = os.listdir(dir)
    print('Checking for required files...')
    for r in req_text:
        found = False
        for f in all_files:    
            if r in f:                         
                found = True
                break
        if not found:
            return False
    return f, True

【讨论】:

    猜你喜欢
    • 2016-05-10
    • 1970-01-01
    • 2016-03-04
    • 2016-08-15
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 2020-12-01
    相关资源
    最近更新 更多