Python-将字符串与csv值匹配,然后提取相邻列

时间:2019-12-11 15:26:35

标签: python string csv match filenames

在使用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

2 个答案:

答案 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', '.', '../')