【问题标题】:TypeError when passing a 'file' variable to a fuction将“文件”变量传递给函数时出现类型错误
【发布时间】:2016-01-11 07:47:31
【问题描述】:

当我第一次将其编码为单个函数时,它起作用了。但是当我检查目录中的文件时,我想做更多的事情,所以我将代码分为两个函数:一个检查以 *.rar 扩展名结尾的目录中的文件,如果它找到匹配的文件,它会将其解压缩到一个目录中。

import shutil, os, patoolib, fnmatch, glob


def unrar():

        patoolib.extract_archive(file, outdir="/root/tree/def")



def chktree():

        for file in glob.glob('/root/tree/down/*'):
                if fnmatch.fnmatch(file, '*.rar'):
                        unrar()

chktree()

在函数chktree():if 之后执行unrar() 不起作用。我想知道我做错了什么,这是输出:

Traceback (most recent call last):
  File "autotube.py", line 16, in <module>
    chktree()
  File "autotube.py", line 14, in chktree
    unrar()
  File "autotube.py", line 6, in unrar
    patoolib.extract_archive(file, outdir="/root/tree/def")
  File "/usr/local/lib/python2.7/dist-packages/patoolib/__init__.py", line 676, in extract_archive
    util.check_existing_filename(archive)
  File "/usr/local/lib/python2.7/dist-packages/patoolib/util.py", line 389, in check_existing_filename
    if not os.path.exists(filename):
  File "/usr/lib/python2.7/genericpath.py", line 26, in exists
    os.stat(path)
TypeError: coercing to Unicode: need string or buffer, type found

【问题讨论】:

标签: python


【解决方案1】:

在 python 2 中,有一个 file 内置函数,这就是您在 unrar 函数中调用的 extract_archive。您没有使用来自chktree 的循环变量,因为它只存在于chktree 中。你可以这样写:

def unrar(f):
    patoolib.extract_archive(f, outdir="/root/tree/def")

def chktree():    
    for f in glob.glob('/root/tree/down/*'):
        if fnmatch.fnmatch(f, '*.rar'):
            unrar(f)

我使用f 作为文件名,以防止屏蔽内置。

【讨论】:

  • 好的,成功了。我使用 built_in 是因为我在这样做时正在咨询 python 文档,他们使用 built_in 作为示例。谢谢。
  • @xavier 也许你读过 Python3 文档? file 不是内置的。
  • 我刚刚检查过,这些是 Python 2.7.11 的文档:docs.python.org/2/library/fnmatch.html
  • @xavier 是的,他们正在掩盖该循环中的内置函数。这对他们的示例没有影响,但仍然不是一个好习惯。
【解决方案2】:

您需要将变量file 显式传递给您正在调用的函数。此外,file 是 Python 中的一个特殊名称,因此您可能应该使用不同的名称,例如 my_file 或简单的 f

import shutil, os, patoolib, fnmatch, glob

def unrar(my_file):
        patoolib.extract_archive(my_file, outdir="/root/tree/def")

def chktree():
        for f in glob.glob('/root/tree/down/*'):
                if fnmatch.fnmatch(f, '*.rar'):
                        unrar(f)
chktree()

此外,正如@mgilson 指出的那样,您看到的实际错误的原因是 Python 认为您指的是内置名称 file,因为您没有传递隐藏它的参数。如果您使用不同的名称,您将获得 NameError

【讨论】:

  • 我认为这是可能的候选人——但是,使用 OP 的代码,我认为不会提出 TypeError。如果是这种情况,他会得到NameError,并且上面发布的代码(在问题中)是正确的(可能不是)。
  • 另外,我可以推荐使用 PEP-8 名称吗? my_file 而不是 myFile :-)
  • @mgilson,我认为这是重用内置名称和缺少参数的组合。
  • 哦,拍摄.. Python2.x -- 对,file 是内置的。这就解释了。
  • @mgilson,当然,我可以更改这些名称。
猜你喜欢
  • 2020-05-09
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多