2016-10-14 4 views
2

Проблема: У меня есть куча файлов, которые были загружены из организации. На полпути через свой каталог данных организация изменила соглашение об именах (причины неизвестны). Я ищу создать сценарий, который будет принимать файлы в каталоге и переименовать файл таким же образом, но просто «вернуться один день».Python - переименовать файлы поэтапно на основе julian day

Вот пример того, как назван один файл: org2015365_res_version.asc

Что мне нужно логика изменить только год день (2015365) в этом случае 2015364. Эта логика должна охватывать несколько лет, поэтому 2015001 будет 2014365.

Я думаю, я не уверен, что это возможно, так как он не работает с текущей датой, поэтому использование модуля, такого как datetime, кажется неприменимым.

Частичная логика Я придумал. Я знаю, что в лучшем случае это рудиментарно, но он хотел нанести удар.

# open all files 
all_data = glob.glob('/somedir/org*.asc') 

# empty array to be appended to 
day = [] 
year = [] 

# loop through all files 
for f in all_data: 
    # get first part of string, renders org2015365 
    f_split = f.split('_')[0] 
    # get only year day - renders 2015365 
    year_day = f_split.replace(f_split[:3], '') 
    # get only day - renders 365 
    days = year_day.replace(year_day[0:4], '') 
    # get only year - renders 2015 
    day.append(days) 
    years = year_day.replace(year_day[4:], '') 
    year.append(years) 
    # convert to int for easier processing 
    day = [int(i) for i in day] 
    year = [int(i) for i in year] 

    if day == 001 & year == 2016: 
     day = 365 
     year = 2015 
    elif day == 001 & year == 2015: 
     day = 365 
     year = 2014 
    else: 
     day = day - 1 

Помимо логики выше, я также наткнулся на функцию ниже от this поста, я не уверен, что будет лучшим способом совместить это с частичной логикой выше. Мысли?

import glob 
import os 


def rename(dir, pattern, titlePattern): 
    for pathAndFilename in glob.iglob(os.path.join(dir, pattern)): 
     title, ext = os.path.splitext(os.path.basename(pathAndFilename)) 
     os.rename(pathAndFilename, 
        os.path.join(dir, titlePattern % title + ext)) 

rename(r'c:\temp\xx', r'*.doc', r'new(%s)') 

Помогите мне, stackoverflow. Ты моя единственная надежда.

ответ

1

Вы можете использовать datetime модуль:

#First argument - string like 2015365, second argument - format 
dt = datetime.datetime.strptime(year_day,'%Y%j') 
#Time shift 
dt = dt + datetime.timedelta(days=-1) 
#Year with shift 
nyear = dt.year 
#Day in year with shift 
nday = dt.timetuple().tm_yday 
0

На основе обратной связи от сообщества, я был в состоянии получить логику, необходимую для исправления файлов, загруженных из орга! Логика была самым большим препятствием. Оказывается, что можно использовать модуль datetime, мне нужно больше узнать об этом.

Я объединил логику с переименованием пакетов с помощью модуля os, я поставил код ниже, чтобы помочь будущим пользователям, у которых может быть аналогичный вопрос!

# open all files 
all_data = glob.glob('/some_dir/org*.asc') 

# loop through 
for f in all_data: 
    # get first part of string, renders org2015365 
    f_split = f.split('_')[1] 
    # get only year day - renders 2015365 
    year_day = f_split.replace(f_split[:10], '') 
    # first argument - string 2015365, second argument - format the string to datetime 
    dt = datetime.datetime.strptime(year_day, '%Y%j') 
    # create a threshold where version changes its naming convention 
    # only rename files greater than threshold 
    threshold = '2014336' 
    th = datetime.datetime.strptime(threshold, '%Y%j') 
    if dt > th: 
     # Time shift - go back one day 
     dt = dt + datetime.timedelta(days=-1) 
     # Year with shift 
     nyear = dt.year 
     # Day in year with shift 
     nday = dt.timetuple().tm_yday 
     # rename files correctly 
     f_output = 'org' + str(nyear) + str(nday).zfill(3) + '_res_version.asc' 
     os.rename(f, '/some_dir/' + f_output) 
    else: 
     pass