2017-08-31 18 views
0

我有一個兩列csv 目錄文件名。在CSV每行顯示每個文件屬於哪個目錄,像這樣png的移動到Python中的適當文件夾

Directory, File Name

DIR18, IMG_42.png

DIR12, IMG_16.png

DIR4, IMG_65.png

到目前爲止,我已經寫代碼,抓住每一個目錄和文件名,從csv,然後在目的地的所有文件如下所示:

movePng.py

import shutil 
import os 
import csv 
from collections import defaultdict 

columns = defaultdict(list) # each value in each column is appended to a list 

with open('/User/Results.csv') as f: 
    reader = csv.DictReader(f) 
    for row in reader: 
     for (k,v) in row.items(): 
      columns[k].append(v) 

source = '/User/PNGItems' 

files = os.listdir(source) 

for f in files: 
    pngName = f[:-4] 
    for filename in columns['File Name']: 
     fileName = filename[:-4] 
     if pngName == fileName 
      # GET THIS POSITION IN columns['File Name'] for columns['Directory'] 
      shutil.move(f, source + '/' + DIRECTORY) 

如何獲得列[「文件名」]的索引,抓取相應的目錄進行列[「目錄」]的?

+1

的代碼,你可以使用'zip',如:'爲文件名,目錄中的zip(列[ '文件名'],列[ '目錄']):' –

+1

爲了獲得列['文件名']的索引,你可以使用它: '爲我,文件名在枚舉(列['文件名']):' – AndMar

+0

我可以使用該索引來訪問列['目錄「]? – RyeGuy

回答

0

爲了解決這個我用@Peter木建議,它漂亮的工作。另外我不得不修改shutil。

這裏是低於

for f in files: 
    pngName = f[:-4] 
    for filename, directory in zip(columns['File Name'], columns['Directory']): 
     fileName = filename[:-4] 
     if pngName == fileName: 
      directoryName = directory[1:] 
      shutil.move(os.path.join(source, f), source + '/' + directoryName) 
+1

是的,如果你有確切的文件夾實際存在的文件夾映射比第一次閱讀映射到字典更有效率。 – nyrocron

+1

關於您的解決方案:您實際上創建了一個不必要的O(n2)複雜性算法,對於大文件而言,該算法會變得非常慢,因爲您正在遍歷每個文件的整個映射。你也每次都在做壓縮(儘管我認爲在現代版本的Python中它相對便宜)。如果按照這種方式進行,只需循環一次CSV文件條目的條目並在必要時處理丟失的文件。外循環只是使整個過程不必要地緩慢。 – nyrocron

1

你應該閱讀的分配到字典中,然後查詢是:

folder_assignment_file = "folders.csv" 

file_folder = dict() 
with open(folder_assignment_file, "r") as fh: 
    reader = csv.reader(fh) 
    for folder, filename in reader: 
     file_folder[filename] = folder 

,然後得到的目標文件夾,如下所示:DIRECTORY = file_folder[fileName]

其他一些提示:

  • filenamefileName不好的變量名,這隻會導致難以發現的缺陷,因爲Python是大小寫敏感的
  • 使用os.path.splitext分裂拓客的文件名
  • 如果不是所有的文件都在一個文件夾中glob模塊和os.walk可能會派上用場

編輯:

創建字典可以做出更漂亮,像這樣:

with open(folder_assignment_file, "r") as fh: 
    reader = csv.reader(fh) 
    file_folders = {filename: folder for folder, filename in reader} 
+0

謝謝!我會測試這個 – RyeGuy

相關問題