2016-04-01 6 views
0

XLSXシートのデータを使用して、複数のフォルダの名前を変更するスクリプトを作成しようとしています(名前とタイムスタンプ名前の一部として、"COMXYZ_YYYYMMDDHHMMSS"形式)。Excelスプレッドシートから読み込み、XLSXのデータで複数のフォルダの名前を変更します

私のディレクトリにあるフォルダは、"COM123_YYYYMMDDHHMMSS"または"COM12_YYYYMMDDHHMMSS"または"COM1_YYYYMMDDHHMMSS"の形式になります。

としてXLSXシートは、フィールドを持っています:

NUMBERは(1から始まる)
FIELD3_FIELD4_FIELD2_MMDDYYYY_FIELD5_NUMBER_FIELD6_FIELD7 

:私は名前"COM12_YYYYMMDDHHMMSS"と私のディレクトリ内のフォルダのように名前を変更したい

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

アンダースコア"_"の後の名前のタイムスタンプに応じて増加し、その日付はその特定の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

これまでに試したことがあるコードを投稿できますか?また、プログラミングに慣れていないと、これは難しいです。問題を小さなタスクに分割し、一度に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 ['%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

関連する問題