当我第一次将其编码为单个函数时,它起作用了。但是当我检查目录中的文件时,我想做更多的事情,所以我将代码分成两个函数:一个检查目录上以* .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
答案 0 :(得分:3)
您需要将变量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
。
答案 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
作为文件的名称来防止屏蔽内置文件。