python - 如何使用Python匹配文件并将其移动到相应的文件夹中

标签 python shutil

我对编程相当陌生,这是我第一次尝试使用 Python 创建复杂的脚本

我创建程序的目的是:

  • 浏览文件列表(单个文件夹中总共 360 个文件)
  • 提取文件名中的 3 个唯一字符,并根据这 3 个字符创建一个文件夹(共 60 个唯一文件夹)
  • 创建一个 for 循环,遍历源文件夹中的文件列表并将其移动到相应的目标文件夹。

示例:

文件名:KPHI_SDUS81_N3KDIX_201205261956

根据角色创建的文件夹:N3K

import os

#Creates a list based on file names in the folder
srcfile=os.listdir("E:\\Learning Python\\Testing out\\thunderstorm stuff")

#Directiory of where the source files are located
srcpath= "E:\\Learning Python\\Testing out\\thunderstorm stuff"

#Creates a list based on the location of where folders will be lcoated.
#List will be empty since for loop has not ran yet
targetsrc=os.listdir("E:\\Learning Python\\Testing out\\test folder")

#path of where the new folders created will be located
targetpath = "E:\\Learning Python\\Testing out\\test folder"

#empty list created to hold a string of 3 characters (see for loop below)
list=[]

#A list to hold the unique string values. (see 2nd for loop below)
Target=[]

#the for loop below looks at a file and gooes to the character place holder index of   12 and looks at the characters UP TO 15.
#It then assigns the three characters to a variable x which then passes the the string (the 3 characters) to an empty list called list. 
for num in srcfile:
  x=num[12:15]
  list.append(x)

#a test to see if the for loop above was able to exact the three characters from the list
print list
print srcfile

#created to see how big the list is which should match the amount of files in folder
print len(srcfile)
print len (list)

#a function created to make a folder based on a list
def create(s):
  targetpath = "E:\\Learning Python\\Testing out\\test folder"
  test=os.mkdir(os.path.join(targetpath,s))

#a dummy variable holder for the for loop below
valhold = "null"

#a nested if statement inside a for loop.
#The for loop goes through all the string values in a list called "list" (assigned to folder in for loop) 
#and checks it against a list called valhold.  If folder and valhold are not equal,
#the values in folder are appened to a list called Target.append which holds unique values.
#The next step is to create a folder a folder based off the list value "valhold"
for folder in list:
  if folder != valhold:
      Target.append(folder)
      valhold=folder
      create(valhold)
  else:
      valhold=folder

#a nested for loop which goes through all the files in the folder for the list "sourcefile"
#and finds a matching filename
for dst in Target:
  wheretonumber=0
  whereto = targetsrc(wheretonumber)  #Name of folder for a given index value "targetsrc"
  for file in list:
      filenumber=0
      filename=srcfile(filenumber) #Name of file for a given index value "sourcefile"
      if file == dst:
          ##os.rename(filename(filenumber),whereto(wheretonumber))
          ##shutil.move(filename,whereto)
      filenumber= filenumber+1
wheretonumber=wheretonumber+1

我能够完成上面要点列表中的前两件事,但很难让第三件事起作用。我研究过 Shutil.move、os.path.walk 和 os.rename 函数,但没有让它们工作。我不断收到错误:

whereto=targetsrc(wheretonumber) 类型错误:“列表”对象不可调用

由于我正在尝试不同的功能,因此我已注释掉 os.rename 和 Shutil.move。我的方法逻辑正确还是我遗漏了什么?关于尝试其他功能或更改我的代码以使其将文件移动到文件夹中的任何建议?

最佳答案

要从 list 变量中删除重复项,只需使用内置的 set() 即可。并且不要使用 list 作为变量名称,这会影响内置 list()

列表使用方括号[]而不是括号进行索引。

我看不到你在哪里向targetsrc分配除了空列表之外的任何内容(你自己编写的:#List将为空,因为for循环尚未运行)。空列表没有元素,因此即使 L[0] 也会超出范围。

尝试这样的事情:

import os
import shutil

srcpath = "E:\\Learning Python\\Testing out\\thunderstorm stuff"
srcfiles = os.listdir(srcpath)

destpath = "E:\\Learning Python\\Testing out\\test folder"

# extract the three letters from filenames and filter out duplicates
destdirs = list(set([filename[12:15] for filename in srcfiles]))


def create(dirname, destpath):
    full_path = os.path.join(destpath, dirname)
    os.mkdir(full_path)
    return full_path

def move(filename, dirpath):
    shutil.move(os.path.join(srcpath, filename)
                ,dirpath)

# create destination directories and store their names along with full paths
targets = [
    (folder, create(folder, destpath)) for folder in destdirs
]

for dirname, full_path in targets:
    for filename in srcfile:
        if dirname == filename[12:15]:
            move(filename, full_path)

关于python - 如何使用Python匹配文件并将其移动到相应的文件夹中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13446857/

相关文章:

python - shutil.rmtree : FileNotFoundError: [Errno 2] No such file or directory: '._xxx'

python - Errno 2 使用 python shutil.py 文件目标没有这样的文件或目录

python - 将子文件夹中的多个文件复制到一个文件夹中

python - 无法使用 python Shutil 复制或移动文件

python - python asyncio 中的协议(protocol)工厂有什么要求?

python - Numpy:将散点图变成二维数组

python - 如何使用字符串格式来显示前导零和 3 的精度?

python - Python pandas 读取大量.csv文件并分配不同的变量名

python - 对数尺度的椭圆和多边形面片

用于移动目录/文件同时使用 shutil 忽略某些目录/文件的 Python 脚本?