2012-11-19 41 views
2

我是相当新的编程文件移动到相应的文件夹,这是我在创建使用Python如何搭配和使用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函数,并没有运气让他们工作。我不断收到错误:

向其中= targetsrc(wheretonumber) 类型错误:“名单”对象不是可调用

我有os.rename和shutil.move注释掉了,因为我想不同的功能。我的逻辑是正确的方法还是我错过了什么?对其他函数有任何建议来尝试或更改我的代码以使它将文件移动到文件夹中?

+0

当您更改该行'向其中= targetsrc [wheretonumber]'会发生什么? – Tim

+0

我也试过,但我收到一个错误,指出列表索引超出范围。 – Sethdd

回答

3

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

列表索引与括号[]不parens。

我看不到你在哪里分配空白列表(你自己写的:#List will be empty since for loop has not ran yet)到targetsrc。空列表没有元素,所以即使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) 
+0

感谢cji让我的代码更加简化了一些。对不起,花了这么久评论回来;它相当繁忙的一周,我相信你知道。代码中有一些错误,但是我能够弄清楚它们,修正它们并成功运行它。我在上面的代码中进行了编辑,以反映我在最后的更正。我感谢您的帮助! – Sethdd