将“file”变量传递给函数时的TypeError

时间:2016-01-11 07:47:32

标签: python

当我第一次将其编码为单个函数时,它起作用了。但是当我检查目录中的文件时,我想做更多的事情,所以我将代码分成两个函数:一个检查目录上以* .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()

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

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

2 个答案:

答案 0 :(得分:3)

您需要将变量file显式传递给您正在调用的函数。另外,file是Python中的一个特殊名称,因此您应该使用其他名称,例如my_filef

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

答案 1 :(得分:3)

在python 2中,有一个file内置版,就是你在extract_archive函数中调用的unrar。您没有使用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作为文件的名称来防止屏蔽内置文件。