在python中,如何对一个目录中的所有文件或基于args的单个文件执行函数

2024-09-27 21:32:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个小脚本,我正在工作的“碎片”单个文件(零字节的文件),我正试图使它,我可以碎片的基础上,如果它收到一个文件或目录标志/arg通过命令行目录中的每个文件。 它对单个文件工作正常,但我得到一个:

IsADirectoryError: [Errno 21] 'Path/To/Directory' error when trying to use it on all files in a directory。我已经尝试了一些方法来安排循环,使他们的工作,但没有到目前为止。我希望这里有人能帮我纠正这个问题。你知道吗

我有argparser设置,这样-F file, -D directory, -s srcpath, -i iterations和bar有关的任何内容都只是我的进度条,它显示脚本在运行时进入进程的程度。你知道吗

这是我的密码:

parser= argparse.ArgumentParser()
parser.add_argument('-F', '--file', action=store_true)
parser.add_argument('-D', '--directory', action=store_true)
parser.add_argument('-s', '--source', required=True, type=str)
parser.add_argument('-i', '--iterations', required=True, type=int)
args = parser.parse_args()

bar = Bar ("Progress: ", max=args.iterations)
srcpath = "path/to/file/"

def shredfile(source, filebytes):
    with open(source, 'r+b') as f:
        byte = f.read(1)
        while byte:
            f.write(filebytes)
            byte = f.read(1)

zeros = ("0000000").encode('UTF-8')

if args.file:
    x=0
    for x in range (args.iterations):
        shredfile(srcpath, zeros)
        bar.next()
    bar.finish()
    print("Completed")

if args.directory:
    for d in os.listdir(srcpath):
        x=0
        for x in range (args.iterations):
            shredfile(srcpath, zeros)
            bar.next()
        bar.finish()
        print("Completed")

Tags: 文件inaddparsersourcezerosbarargs
3条回答

我猜你不能分解一个目录,而只能分解单个文件。你知道吗

shredfile(os.path.join(srcpath, d), zeros)

这是一个正确的方法。您只需添加进度条和参数解析等部分。 您还需要添加一些try-except块来控制操作错误时发生的情况,比如权限被拒绝和类似的事情。你知道吗



import sys
import os

def shredfile (source, filebytes=16*"\0"):
    f = open(source, "rb")
    f.seek(0, 2)
    size = f.tell()
    f.close()
    if len(filebytes)>size:
        chunk = filebytes[:size]
    else:
        chunk = filebytes
    f = open(source, "wb")
    l = len(chunk)
    n = 0
    while n+l<size:
        f.write(chunk)
        n += l
    # Ensure that file is overwritten to the end if size/len(filebytes)*len(filebytes) is not equal to size
    chunk = filebytes[:size-f.tell()]
    if chunk: f.write(chunk)
    f.close()

def shreddir (source, filebytes=16*"\0", recurse=0):
    for x in os.listdir(source):
        path = os.path.join(source, x)
        if os.path.isfile(path):
            shredfile(path, filebytes)
            continue
        if recurse:
            shreddir(path, filebytes, 1)

def shred (source, filebytes=16*"\0", recurse=0):
    if os.path.isdir(source):
        shreddir(source, filebytes, recurse)
        return
    shredfile(source, filebytes)

if len(sys.argv)>1:
    print "Are you sure you want to shred '%s'?" % sys.argv[-1],
    c = raw_input("(Yes/No?) ").lower()
    if c=="yes":
        shred(sys.argv[-1])
# Here you can iterate shred as many times as you want.
# Also you may choose to recurse into subdirectories which would be what you want if you need whole directory shredded

os.listdir返回目录中的文件名

for f in os.listdir(srcpath):
  full_path = os.path.join(f, srcpath)
  ...
    shredfile(full_path, zeros)
  ...
  print("Completed")

相关问题 更多 >

    热门问题