Python:组合 'complex' 个函数;一个有 oswalk 另一个写入 file/database

Python: Combining 'complex' functions; one has oswalk other writes to file/database

我已经阅读了很多在主函数中组合函数或在两者都定义后调用它们的示例,但是所有示例都非常简单,并且不容易应用于我正在尝试做的事情。

到目前为止,我将粘贴代码。请注意,如果通过写入输出文件正确传递文件,则为了快速打印 statement/checking 而缩短此处的第二个函数。在完整的第二个函数中,'n2' 的值实际上是要输入到 SQlite3 数据库中,这样我就可以识别 table 中的哪些条目来自给定文件。

当我单独调用下面的这些函数时,例如在下面的代码中,我从第一个函数中获得了一个名称列表,但是

<函数 fastq2SQlite 在 0x0000000011CD7208>

第二次,没有创建函数中指定的文件。

感谢您的帮助。

import os
import fnmatch

def findFiles (path, filter):
    files = []
    for root, dirs, files in os.walk(path):
        for file in fnmatch.filter(files, filter):
            files.append(os.path.join(root, file))
    return files

def fastq2SQlite(files):
    nmlst = []
    out = ('path.txt', 'w')
    for f in files:
        names = f.split('\')
        continue
    for name in names:
        n = name.split('.')
        n2 = n[0]
        nmlst.append(n2)
    out.write(n2)
    out.close()
    return n2

print findFiles('path', 'filter')
print fastq2SQlite()

您还没有将 files 参数传递给 fastq2SQlite() 函数,试试这个:

print fastq2SQlite(findFiles('path', 'filter'))

您可能会想到在 运行 您的第一个函数 findFiles 之后,files 将自动传递给第二个函数功能,它不是这样工作的。

files in findFiles 是一个本地名称空间,无法从您的函数外部访问。为了使您的第二个函数起作用,您仍然需要将参数 files 传递给它。

您的奇怪行为是因为您试图在没有 () 的情况下打印函数,如下所示:

print fastq2SQlite
<function fastq2SQlite at 0x111917230>

并且要实际调用您需要添加的函数 (无论您需要传递什么参数),在您的情况下我认为是这样的:fastq2SQlite(findFiles('path', 'filter')),希望如此有帮助。

你的一个错误是在这个函数中:

def findFiles (path, filter):
    files = []
    for root, dirs, files in os.walk(path):
        for file in fnmatch.filter(files, filter):
            files.append(os.path.join(root, file))
    return files

您使用了标识符 files 两次:不仅作为您要初始化到 []、追加并最终返回的列表的标识符,而且 作为 for root, dirs, files in os.walk(path): 中的循环变量,因此每次循环时它都被重新绑定到不同的列表。重命名两种用途之一,例如

def findFiles (path, filter):
    all_files = []
    for root, dirs, files in os.walk(path):
        for file in fnmatch.filter(files, filter):
            all_files.append(os.path.join(root, file))
    return all_files

修复这一错误。另一个错误是:

print findFiles('path', 'filter')
print fastq2SQlite()

您只是在打印文件列表,而不是将其传递给fastq2SQlite。要解决此问题,请将代码更改为:

all_files = findFiles('path', 'filter')
print all_files
print fastq2SQlite(all_files)

此外,在 fastq2SQlite 中,您分配 out 一个元组:

out = ('path.txt', 'w')

但是后来你又调用了out.write,这是没有意义的。也许你的意思是

out = open('path.txt', 'w')

此外,在 for f in files: 循环中,循环末尾的 continue 是无用且多余的(尽管至少与其他错误不同,无害:-).

可能还有其他错误,但即使是我的 "debugger eyes" 在这么小的指南针中找到三个主要错误后也感到筋疲力尽...:-)