簡體   English   中英

Python - 基於儒略日增量重命名文件

[英]Python - rename files incrementally based on 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

除了上面的邏輯,我還在這篇文章中遇到了下面的函數,我不確定將它與上面的部分邏輯結合起來的最佳方法是什么。 想法?

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。 你是我唯一的希望。

您可以使用日期時間模塊:

#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

根據社區的反饋,我能夠獲得修復從組織下載的文件所需的邏輯! 邏輯是最大的障礙。 事實證明可以使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM