Python版本:2.7.13
操作系统:Windows
因此,我正在编写一个脚本,根据文件名中包含文件夹名的要求,将各种名称的文件复制到特定文件夹中。(我对这一点相当陌生,只是想在工作中创建更高效的脚本——我查看了大量StackOverflow页面和web上的一些地方,但找不到与此特定任务相关的Python)
我已经将文件夹转换为一个字符串列表,我可以搜索文件名,但是当我将它们复制到上面时,它们都会进入找到的第一个文件夹。我需要帮助的正是如何将文件复制到它找到字符串匹配的文件夹中。
本质上,"if any(x in diName for x in list):","将文件移动到x"。
关于源文件夹和德文件夹,这些变量是从代码前面的用户输入中获得的。(源文件夹包含文件,德文件夹包含我要复制到的子文件夹)
编辑:我有多个子文件夹在de Folder,我可以得到的文件复制,如果他们匹配一个字符串,(如果没有匹配,他们不复制)。然而,当它们复制时,它们都转到同一个子文件夹。
list=[]
if var == "y": #Checks for 'Yes' answer
for subdir, dirs, files in os.walk(destFolder):
subdirName = subdir[len(destFolder) + 1:] #Pulls subfolder names as strings
print subdirName
list.insert(0, subdirName)
print "Added to list"
for subdir, dirs, files in os.walk(sourceFolder):
for file in files:
dirName = os.path.splitext(file)[0] #This is the filename without the path
destination = "{0}\{1}".format(destFolder, subdirName)
string = dirName #this is the string we're looking in
if any(x in dirName for x in list):
print "Found string: " + dirName
shutil.copy2(os.path.join(subdir, file), destination)
else:
print "No String found in: " + dirName
编辑2:经过一些调整和外部帮助,就工作代码而言,以下是我最终得到的(为了任何遇到这个的人)。一些变量更改了名称,但希望结构是可读的。
从os导入shutil、os、re、stat从os导入listdir.path导入isfile,加入
检查结果
if var == "y": #Checks for 'Yes' answer
for root, dirs, files in os.walk(destFolder):
for dest_folder in dirs: #This is the folder, for each we look at
destKey[dest_folder] = os.path.join(root, dest_folder) #This is where we convert it to a dictionary with a key
for sourceFile in os.listdir(sourceFolder):
print ('Source File: {0}').format(sourceFile)
sourceFileName = os.path.basename(sourceFile) #filename, no path
for dest_folder_name in destKey.keys():
if dest_folder_name in sourceFileName.split('-'): #checks for dest name in sourceFile
destination = destKey[dest_folder_name]
print "Key match found for" + dest_folder_name
shutil.copy2(os.path.join(sourceFolder, sourceFile), destination)
print "Item copied: " + sourceFile
您的解决方案是使用any()确定文件是否与任何子目录匹配,然后将文件移动到存储在子目录中的最后一个值。请注意subdirName是如何在上一个循环中最后设置的,因此它的值在第二个循环中永远不会更改。我还看到了其他一些问题。假设destFolder和sourceFolder不相同且有子目录,则需要一个子目录名列表,但还需要一个完整的相对路径列表。最好不要用自己的变量名覆盖基本类型,如
list
。试试这个:
from os.path import dirname, join, splitext
from os import walk
dir_list = []
if var == "y": #Checks for 'Yes' answer
for subdir, dirs, files in walk(destFolder):
dir_list.append(subdir) # keeping the full path, not just the last directory
print 'Added "{0}" to the list'.format(subdir)
for subdir, dirs, files in walk(sourceFolder):
for file in files:
fname = splitext(file)[0] # This is the filename without the path
for dpath in dir_list:
# Fetch last directory in the path
dname = dirname(dpath)
if dname in fname:
# Directory name was found in the file name; copy the file
destination = join(destFolder, dpath, file)
shutil.copy2(join(subdir, file), destination)
我还没有测试过上面的内容,但这应该会让您了解如何使其工作。
我试着让它尽可能接近你的原始代码。我们将所有包含文件夹名称的文件都放入相应的文件夹中。通过使用集合缓存遍历所有目录,我们不会重复任何文件。
import os, shutil
dirs_ls = []
destFolder = 'Testing'
for subdir, dirs, files in os.walk(destFolder):
subdirName = subdir[len(destFolder) + 1:] # Pulls subfolder names as strings
dirs_ls.append(subdirName)
dirs_ls = filter(None, dirs_ls)
copied_files = set()
for subdir, dirs, files in os.walk(destFolder):
for file_name in files:
if file_name in copied_files:
continue
file_name_raw = file_name.split('.')[0]
for dir in dirs_ls:
if dir not in file_name_raw:
continue
shutil.copy2(os.path.join(destFolder, file_name), os.path.join(destFolder, file_name_raw))
copied_files.add(file_name)
脚本运行前的目录结构:
.
├── bro
├── bro.txt
├── foo
├── foo.txt
├── yo
└── yo.txt
脚本运行后的目录结构:
.
├── bro
│ └── bro.txt
├── bro.txt
├── foo
│ └── foo.txt
├── foo.txt
├── yo
│ └── yo.txt
└── yo.txt
我是这样做比较的:
list = ["abc", "def", "ghi"]
dirname = "abcd"
for x in list:
if x in dirname:
print(dirname, x)
因此,您的代码如下所示:
for subdir, dirs, files in os.walk(sourceFolder):
for file in files:
dirName = os.path.splitext(file)[0] #This is the filename without the path
destination = "{0}\{1}".format(destFolder, subdirName)
for x in list:
if x in dirName:
print "Found string: " + dirName
shutil.copy2(os.path.join(subdir, file), destination)
else:
print "No String found in: " + dirName
这能解决问题吗?
这个问题是本文的后续内容:Python-根据子文件夹和文件名重命名子文件夹中的文件。 我正在尝试遍历中子文件夹中的文件,并以指定的方式重命名每个文件。以下是我目前掌握的代码: 当我运行该行时,,它正确地显示保存在中的名为的文件将被重命名为。 但是,os.rename命令返回以下错误: "必须是字符串,而不是列表。" 这似乎是由于我在os.rename命令中使用了“文件名”。据我所知,os.rena
我有一个Windows文件夹结构和文件,如下所示 c:\源文件\file1.txt c:\源文件夹\subfolder1\file2.txt c:\源文件夹\子文件夹2\file3.txt 我想复制所有文件到目标文件夹,如下所示 c:\DestinationFile\file1.txt c:\DestinationFile\file2.txt c:\DestinationFile\file3.tx
问题内容: 我正在尝试压缩包含子文件夹的文件夹。尝试压缩名为10-18-2010_4D的文件夹。以上程序以以下异常结束。请提供有关如何解决此问题的建议。 问题答案: 您需要检查文件是否为目录,因为您无法将目录传递给zip方法。 看一下该页面,该页面显示了如何递归压缩给定目录。
问题内容: 我有一个名为“数据”的文件夹。此文件夹有一个名为“收件箱”的子文件夹,其中有多个“ .txt”文件。可以修改“数据”文件夹,最后会有多个带有“收件箱”子文件夹和“ .txt”文件的子文件夹。我需要监视“收件箱”文件夹中的“数据”文件夹和“ .txt”文件。我怎样才能做到这一点? INotify只是监视文件夹,并在创建子文件夹时弹出事件。创建“ .txt”文件(在哪个文件夹中)时,如何弹
问题内容: 这个问题已经在这里有了答案 : 使用Java将文件从一个目录复制到另一个目录 (33个答案) 4年前关闭。 如何将一个文件夹及其所有子文件夹和文件复制到另一个文件夹中? 问题答案: Apache Commons IO可以为您解决问题。看看FileUtils。
问题内容: 我在将包含该文件夹中文件的文件夹复制到另一个文件夹时遇到一些问题。Command 不会复制文件夹中的文件。 问题答案: 您正在寻找的选项是。 如果不存在,将创建它。 意味着。您也可以使用,因为它不区分大小写。 请注意根据@ muni764的注释添加尾随的细微差别。