在 for 循环中打印文件数据

Print file data during a for loop

这个问题又要提了,我是Python新手,解决不了

当文件移动到新文件夹时,我正在尝试在此 for 循环中打印文件名和文件大小。我知道 os.path.getsize(path)os.stat(path).st_size 方法,但是如果我的文件每次循环都更改,我可以输入哪个路径? 这段代码没有错误,但我不知道如何在文件更改时循环打印数据。

src = ("C:\..\files")
dest1 = ("C:\..\files\images")
files = os.listdir(src)   #files is a list of files in a folder

for file in files:
    if file.endswith(".jpg") or file.endswith(".png") or file.endswith(".jpeg"):
        if not os.path.exists(dest1):
            os.mkdir(dest1)
        shutil.move(src + "/" + file, dest1) #for every file that is moved I have to print filesize and filename.
        #print(??)
            

移动文件通常不会改变文件大小 [1],因此您可以在执行移动之前检查文件的大小。

另一方面,由于您知道文件的移动位置,因此还可以确定移动后的文件大小。将文件从 src + "/" + file 移动到 dest1 意味着文件应该在操作后 dest1 + "/" + file [2]。您不仅可以使用它来打印文件的新路径,还可以确定文件在新位置的大小。

[1](注意:当从一个文件系统移动到另一个文件系统时,文件大小 可以 发生变化,块大小和大小指定为块大小的倍数。但是,对于这种情况,这应该不是问题。)

[2] 移动文件可能因多种原因而失败(文件被间歇性删除,目标位置已经有同名的(写保护)文件,目标位置没有 space ,...)。您应该为这种情况添加一些错误处理,例如在 shutil.move 操作周围使用 try ... except 块。

IIUC,尝试:

src = ("C:/Users/username/")

with open("recap.csv", "w") as recap_file:
    csv_writer = csv.writer(recap_file, delimiter="\t")
    
    for file in os.listdir(src):
        if file.endswith(".jpg") or file.endswith(".png") or file.endswith(".jpeg"):
            dest = f"{src}/images"
        elif file.endswith(".odt") or file.endswith(".txt"):
            dest = f"{src}/docs"
        elif file.endswith(".mp3"):
            dest = f"{src}/audios"
        else:
            continue        
        size = os.path.getsize(f"{src}/{file}")
        print(f"File name: {src}/{file}; Size: {size}")
        csv_writer.writerow([f"{src}/{file}", size])
        if not os.path.exists(dest):
            os.mkdir(dest)
        shutil.move(f"{src}/{file}", dest)