2016-04-01 52 views
0

我正在嘗試編寫一個腳本,它使用XLSX工作表中的數據根據​​名稱和時間戳(這是一個也是名稱的一部分,格式爲"COMXYZ_YYYYMMDDHHMMSS")。從Excel電子表格中讀取數據,並使用XLSX中的數據重命名多個文件夾

我的目錄中的文件夾格式爲"COM123_YYYYMMDDHHMMSS""COM12_YYYYMMDDHHMMSS""COM1_YYYYMMDDHHMMSS"

的XLSX片將有領域:

FIELD1 | FIELD2 | FIELD3 | FIELD4 | FIELD5 | FIELD6 | FIELD7 
COM12  A  B  C  D  E  F 
COM23  A  B  C  D  E  F 

我想在我的名爲"COM12_YYYYMMDDHHMMSS"目錄中的文件夾改名爲:

FIELD3_FIELD4_FIELD2_MMDDYYYY_FIELD5_NUMBER_FIELD6_FIELD7 

其中NUMBER(從1開始)根據名稱中的下劃線"_"後面的時間戳增加,並且該日期根據名稱中的時間戳以及該特定的COM#。

我有多個文件夾具有相同的COM#,但具有不同的時間戳。到目前爲止,我可以爲每個COM#重命名1個文件夾,但其餘文件夾不會被重命名。

感謝任何和所有的幫助。

我從Aquiles幫助迄今爲止寫的代碼答案是:

import os 
import random 
import string 
import datetime 
import re 
import openpyxl 
from collections import namedtuple 
# Get Directories 
directories = [name for name in os.listdir(r'.') if name.startswith('COM')] 
# Load workbook 
wb = openpyxl.load_workbook('database.xlsx') 
ws = wb['Sheet1'] 
rows = 20 
for i in xrange(2, rows + 2): 
    if ws['A%s' % i].value >= "": 
     folder_to_change = [x for x in directories if x.startswith((ws['A%s' % i].value) + '_')] 
     folder_to_change = folder_to_change[0] if len(folder_to_change) > 0 else None 
     date_used = {} 
     if folder_to_change: 
      directories.remove(folder_to_change) 
      # print folder_to_change 
      folder_parts = folder_to_change.split('_') 
      comport = folder_parts[0] 
      timestamp = folder_parts[1] 
      # print timestamp 
      ts = re.search('(....)(....)(......)', timestamp) 
      date = ts.group(2) + ts.group(1) 
      # print date 
      time = comport 
      # print time 
      date_used[comport] = 1 if comport not in date_used else date_used[comport] + 1 
      # print date_used 
      # print folder_to_change 
      os.rename(
       folder_to_change, 
       '{0}_{1}_{2}_{3}_{4}_{5}_{6}_{7}_{8}'.format(
       ws['B%s' % i].value, 
       ws['C%s' % i].value, 
       ws['G%s' % i].value, 
       date, 
       ws['D%s' % i].value, 
       date_used[comport], 
       ws['F%s' % i].value, 
       ws['H%s' % i].value, 
       ws['I%s' % i].value 
       ) 
      ) 
+1

你可以發佈你到目前爲止嘗試過的代碼嗎?另外,如果你不熟悉編程,這很難。您可以嘗試將問題分解爲更小的任務,並逐個解決它們。 – mareoraft

+0

@mareoraft 到目前爲止,我正在掃描文件夾的目錄。需要研究如何從這裏開始。我知道這將是一項艱鉅的任務,但我相信這會幫助我從這裏獲得人們的想法和知識。 '進口OS 進口SYS 進口隨機 高清get_immediate_subdirectories(文件夾): 回報[名稱爲os.listdir(文件夾)名 如果os.path.isdir(os.path.join(文件夾名)) ] print get_immediate_subdirectories(「。」)' – BrightShad0w

+0

嘿,所以現在的問題是它沒有改變所有的文件夾?這是因爲在if ws ['A%s'%i] .value> =「」之後,應該有一段時間或某事,以便folder_to_change列表中的所有文件夾都被更改。祝你好運! – Aquiles

回答

0

我沒有測試過這一點,一些指標和東西未必是正確的,但你」我會從中得到這個想法。我相信這可以工作:

import os 
import openpyxl 
import string 

# Get directories 
directories = [name for name in os.listdir('.')] 

# Load Workbook 
wb = openpyxl.load_workbook('file.xls') 

# Load first work sheet 
ws = wb[0] 
rows = 10 
dates_used = {} 
for i in xrange(2, rows + 2): 
    folder_to_change = [x for x in directories if x.startswith(ws['A%s' % i])] 
    for y, folder in enumerate(folder_to_change): 
     date = folder[8:16] 
     os.rename(folder, '{0}_{1}_{2}_{3}_{4}_{5}_{6}_{7}'.format(
      ws['C%s' % i], ws['D%s' % i], ws['B%s' % i], date, ws['E%s' % i], 
      y+1, ws['F%s' % i], ws['G%s' % i]) 
+0

太棒了,你給了我如何接近它的方向,非常感謝它。我很難在「_」處分割文件夾名稱,並使用文件夾名稱右側的日期,而不是使用定義的數字位置8-16。 – BrightShad0w

+0

要做到這一點,如果名稱被一個「_」分隔,你可以使用:file_name = folder.split(「_」),它會給你一個由「_」分隔的所有名稱的數組,然後你可以使用file_name [-1]得到最右邊的一個。那麼,如果你想使用完整的字符串,就像這樣,或者如果你想採取一些你使用[:]格式的部分 – Aquiles

+0

按預期工作。非常感謝 :) – BrightShad0w

相關問題