我写了一些简单易用的代码来重命名很多文件。 源文件夹是路径(文件位于主文件夹和许多子文件夹中。 目标文件夹是newPath(这里我想将所有重命名的文件组合在一起。
代码有效,但我想更改/更新它。
我现在不知道如何在shutil.copy中包含文件夹名称
"changed" + str(count) + ".csv"
如何获取文件所在的文件夹名称,包含在复制的名称中?
import os
import shutil
def main():
path = "C:/code/convert/renamefiles/source"
newPath = "C:/code/convert/renamefiles/target"
count = 1
for root, dirs, files in os.walk(path):
for i in files:
if i.endswith('lb_panorama.csv'):
shutil.copy(os.path.join(root, i), os.path.join(newPath, "changed" + str(count) + ".csv"))
print i
count += 1
if __name__ == '__main__':
main()
答案 0 :(得分:2)
我使用pathlib
遍历目录,因为它比你使用的方法简单得多。我不检查源路径和目标路径是否存在,因此如果不存在则会抛出异常。复制文件时,会将它们重命名为源父文件夹的名称,该名称将使用pathlib.Path.parent.name
进行检索。
代码的最高位是记录器。它记录到名为CopyErrors.log
的文件,并在与Python脚本相同的目录中创建。要记录错误,我只会捕获shutil.copy
抛出的任何异常。
import pathlib
import shutil
import logging
def main(src, dest):
logger = logging.getLogger("CopyFiles")
logger.setLevel(logging.WARNING)
handler = logging.FileHandler(filename = "CopyErrors.log",
encoding = "utf-8",
mode = "w")
handler.setFormatter(logging.Formatter(
"%(asctime)s - [%(levelname)s] %(name)s: %(message)s"))
logger.addHandler(handler)
pathSrc = pathlib.Path(src).glob("**/*.csv")
for file in pathSrc:
try:
shutil.copy(str(file), f"{dest}/{file.parent.name}.csv")
except Exception as e:
logger.warning(f"{file} could not be copied.\n"
f"{type(e).__name__}: {e}")
if __name__ == '__main__':
main("Z:/Geoportal/MoMa/MoMa1", "Z:/Geoportal/MoMa/Moma1_new")