3

我有几年来名为 day00000.nc、day00001.nc、day00002.nc、...day00364.nc 的文件。它们代表 365 或 366 天。我想重命名我的文件,例如 day20070101.nc, day20070102.nc, ...day20071231.nc 我该怎么做?谢谢

4

3 回答 3

15

使用datetime模块从一年中的某一天获取日期。我假设您的示例中的年份是 2007 年,因为您的文件名似乎没有年份值。如果需要,请随意2007用变量替换代码中的硬编码。

import datetime
oldFilename = 'day00364.nc'
day = int(oldFilename[3:-3])
date = datetime.datetime(2007, 1, 1) + datetime.timedelta(day) #This assumes that the year is 2007
newFilename = 'day%s.nc'%date.strftime('%Y%m%d')
print newFilename # prints day20071231.nc

对于那些因为“这个解决方案增加了一天”而不赞成这个答案的人

OP 的文件编号为 0 到 364,而不是 1 到 365。此解决方案适用于 OP。如果您的日期是从 1 到 365,并且对您来说一点也不明显,请在将其转换为 timedelta 值之前从 day 变量中自由地减去“1”。

于 2013-06-20T14:39:11.503 回答
3

datetime使用格式说明符在其strptime功能中内置了 julian 转换器。%j假设您的文件是'day'两位数年份 + 朱利安 + 扩展名(如果不是,只需添加您真正拥有的任何年份偏移量)

file_date = filename[3:-3]
file_date = datetime.datetime.strptime(file_date, '%y%j').strftime('%Y%m%d')
new_filename = file_date.strftime('day%Y%m%d.nc')

在评论如何获得年份之后

year = datetime.datetime.fromtimestamp(os.path.getctime(filename)).year
file_date = datetime.datetime.strptime(filename[5:-3], '%j').replace(year=year)
new_filename = file_date.strftime('day%Y%m%d.nc')
于 2013-06-20T14:37:45.650 回答
1

使用 GNU awk 和任何类似 Bourne 的 shell

for old in *
do
    new=$( gawk -v old="$old" 'BEGIN{
            secs = (gensub(/[^[:digit:]]/,"","g",old) + 1) * 24 * 60 * 60
            print gensub(/[[:digit:]]+/,strftime("%Y%m%d",secs),"",old)
        }' )
    echo mv "$old" "$new"
done

测试后去掉“回声”。

于 2013-06-20T20:43:54.590 回答