【问题标题】:Print file data during a for loop在 for 循环期间打印文件数据
【发布时间】:2021-09-20 12:25:54
【问题描述】:

我要再次提出这个问题,我是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(??)
            

【问题讨论】:

  • 您的问题不清楚,请考虑根据stackoverflow.com/help/how-to-ask改写
  • 您好,欢迎您!请查看stackoverflow.com/help/minimal-reproducible-example,并希望一次只关注一个问题。另请查看pathlib.Path 以方便路径操作。在更简洁的代码/重构中,尝试一次做“一件事”,你在 for 循环中有几件事发生。
  • 您收到实际的错误消息了吗?如果是这样,将其添加到您的问题中会很有用。还可以尝试发布一个更简单的问题示例,它不必是您的实际代码,而是一个演示问题的更短示例。我可能建议的一种方法是将代码分成两个循环:一个构建(原始文件->重命名文件)对列表(可能是字典或元组列表?),另一个进行实际移动。在那之后,考虑将第一个循环(从一些输入数据构建一个字典)转换为一个字典理解/列表理解。只是一个想法。
  • 我把问题简化了,希望现在更清楚。

标签: python shutil os.path


【解决方案1】:

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)

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 如果我尝试打印 (os.path.getsize(dest1 + "/" + file)),我有一个错误:只能将 str (不是 "int") 连接到 str。跨度>
    猜你喜欢
    • 2020-05-01
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多