我想: 编写一个脚本,将单个目录路径作为命令行参数,然后遍历该路径的所有子目录,查找扩展名为“.py”的文件,将每个子目录复制到文件系统中的临时目录(例如/ tmp / pyfiles )。您的脚本应检查是否存在临时目录,如果已存在则将其删除;然后它应该在开始复制文件之前创建一个新目录。
我有这个:
#!/usr/bin/env python
import os, sys
import shutil
#import module
rootdir = sys.argv[1]
#take input directory
if os.path.exists('tmp/pyfiles'):
shutil.rmtree('tmp/pyfiles')
if not os.path.exists('tmp/pyfiles'):
os.makedirs('tmp/pyfiles')
#check whether directory exists, if it exists remove and remake, if not make
for root, dirs, files in os.walk(rootdir):
for f in files:
if os.path.splitext(f)[1] in ['.py']:
shutil.copy2(f, tmp/pyfiles)
#find files ending with .py, copy them and place in tmp/pyfiles directory
我收到此错误:
Traceback (most recent call last):
File "seek.py", line 20, in <module>
shutil.copy2(f, tmp/pyfiles)
NameError: name 'tmp' is not defined
有人可以帮帮我吗?:)谢谢
答案 0 :(得分:0)
您的代码显示shutil.copy2(f, tmp/pyfiles)
,我认为这意味着
shutil.copy2(f, 'tmp/pyfiles')
。
答案 1 :(得分:0)
当你使用时 os.walk() 方法你忘记了文件的完整路径。我要做的是使用分析每个目录 os.listdir() 方法然后复制每个文件考虑其绝对路径。像这样:
for root, dirs, files in os.walk(rootdir):
for dir in dirs:
for f in os.listdir(dir):
if os.path.splitext(f)[1] in ['.py']:
shutil.copy2(os.path.join(root, dir, f), "tmp/pyfiles")
我希望这有帮助,也许有更清洁的解决方案。
答案 2 :(得分:0)
按照你的说法做,你必须检查根目录是否存在,如果没有创建新目录,请进入以删除所有内容。
要从dir
复制到您的文件,您必须检查文件名以dir
结尾的.py
中的文件,然后用根路径替换dir路径并在根目录中创建新文件匹配文件的内容
如果我们在dir
中找到了一个目录,我们应该在根目录中创建一个新目录
之后,只需递归调用函数,将dir
的所有内容复制到根目录
import os, sys
rootdir = sys.argv[1]
PATH = "/tmp/pyfiles/"
def check(path, _file):
global rootdir, PATH
for item in os.listdir(path):
newpath = os.path.join(path, item)
if os.path.isdir(newpath):
os.mkdir(os.path.join(PATH, newpath.replace(rootdir, '')))
check(newpath, _file)
else:
if item.endswith(_file):
source = open(newpath, 'r')
print os.path.join(path, newpath.replace(rootdir, ''))
output = open(os.path.join(PATH, newpath.replace(rootdir, '')), 'w')
output.write(source.read())
output.close()
source.close()
if __name__ == '__main__':
if os.path.isdir(PATH):
for root, dirs, files in os.walk(PATH, topdown=False):
for name in files:
os.remove(os.path.join(root, name))
for name in dirs:
os.rmdir(os.path.join(root, name))
os.rmdir(PATH)
os.mkdir(PATH)
check(rootdir, '.py')
我希望它会有用。