在使用Python时,我非常环保,因此请原谅我令人讨厌的格式或较差的优化。
我正在尝试编写一个脚本,以根据文件名将文件分类到新文件夹中。 为了使它们的名称与正确的新位置匹配,我有一个包含两列的csv文件;第一个是文件名的一部分,第二个是文件所属的正确文件夹。
到目前为止,我已经编写了所有东西来提取我需要的文件名的一部分,但是现在我仍然无法确定如何将必须具有的字符串与csv中的值进行匹配,然后提取相邻的列。
这是我到目前为止所拥有的:
import os
import csv
def openCSV(csvFile):
file = open(csvFile)
reader = csv.DictReader(file)
data = list(reader)
return data
def findDemoName(fileName):
demoName = fileName[16:]
demoName = demoName[:-11]
return demoName
def moveFiles(sortingFile, sourceDirectory, destinationDirectory):
sortingCSV = openCSV(sortingFile)
srcDir = sourceDirectory
destDir = destinationDirectory
for filename in os.listdir(srcDir):
name = findDemoName(filename)
print(name)
# begin program
if __name__ == "__main__":
# set the CSV used to sort the files
fileToSortFrom = '<csv used for sorting>'
inputDirectory = '<where the files are located>'
outputDirectory = '<where I want to move the files>'
moveFiles(fileToSortFrom, inputDirectory, outputDirectory)
现在,它只打印文件名的提取部分并打印出来,这样我就可以确保它正在执行我想要的操作。
所以我的下一步是 1.将提取的文件名部分与csv第一栏中的匹配值进行匹配 2.取得匹配项旁边的值,并使用它来完成要移动到的文件的目标路径
我找到了这个线程match names in csv file to filename in folder,但是我不知道csv匹配的答案是什么。
如果我需要澄清一些要点,请告诉我,我会的。
预先感谢您阅读:)
我试图迷失方向,这是我到目前为止的收获:
import os, shutil
import csv
def openCSV(csvFile):
file = open(csvFile)
reader = csv.DictReader(file)
data = list(reader)
return data
"""def createReader(csvFile):
file = open(csvFile)
reader = csv.DictReader(file)
return reader"""
def extractDemoName(fileName):
originalName = fileName
demoName = fileName[16:]
demoName = demoName[:-11]
return demoName
def moveFiles(sortingFile, sourceDirectory, destinationDirectory, prefix, suffix):
reader = openCSV(sortingFile)
#reader = createReader(sortingFile)
srcDir = sourceDirectory
destDir = destinationDirectory
column1 = 'DemographicName'
column2 = 'DemographicTypeName'
folder = ''
for filename in os.listdir(srcDir):
name = extractDemoName(filename)
for row in reader:
if row(column1) == name:
folder = row(column2)
destination = destDir + folder
file = prefix + name + suffix
shutil.copy(file, destination)
print('Moved ' + file + ' to ' + destination)
#else reader.next()
print(name)
# begin program
if __name__ == "__main__":
# set the CSV used to sort the files
fileToSortFrom = '<csv file>'
inputDirectory = '<source path>'
outputDirectory = '<destination path>'
filePrefix = '<beginning text of files>'
fileSuffix = '<ending text of files>'
moveFiles(fileToSortFrom, inputDirectory, outputDirectory, filePrefix, fileSuffix)
但是现在我收到以下错误:
Traceback (most recent call last):
File "script.py", line 63, in <module>
moveFiles(fileToSortFrom, inputDirectory, outputDirectory, filePrefix, fileSuffix)
File "script.py", line 38, in moveFiles
if row(column1) == name:
TypeError: 'collections.OrderedDict' object is not callable
答案 0 :(得分:0)
有问题(第38行)
if row(column1) == name:
应该是
if row[column1] == name:
我还没有检查脚本中的其他逻辑:)
答案 1 :(得分:0)
此脚本从您在方法move_files
的{{1}}中传递的目录中读取文件。
它会检查from_dir
中的文件是否存在于csv_file中,如果存在,它将获取位置并将其移至该目录。
from_dir
我正在使用的csv如下:
import os
import csv
import shutil
def get_file_sorter_dict(csv_file):
return dict(list(csv.reader(open(csv_file))))
def move_files(csv_file, from_dir, to_dir):
file_sorter_dict = get_file_sorter_dict(csv_file)
for filename in os.listdir(from_dir):
if file_sorter_dict.get(filename):
# you can use the location to move the file from csv_file
# move_to = file_sorter_dict.get(filename)
# shutil.move(filename, move_to)
# or you can use to_dir to move the file.
shutil.move(filename, to_dir)
if __name__ == "__main__":
move_files('files_sorter.csv', '.', '../')