返回不同文件夹中文件的绝对路径

时间:2020-03-20 11:54:03

标签: python-3.x

我想编写一个返回文件绝对路径的函数。文件夹的结构如下:

2020
    02
      01
        .csv
      02
        .csv
      03
        .csv
      ..
    03
    ..

年->月->天-CSV文件

该函数需要从当天开始使用x-2提取最后7个文件。例如:如果今天是3月20日,我需要从3月11日到17日归档。这是很容易的部分,但是如果我需要两个月以上的时间来保存文件,我现在就陷入困境。例如,今天是3月3日,我需要2月23日至29日,或者今天是3月4日,我需要2月24日至3月1日。 到目前为止,这是我的功能:

currentDay = '05'
currentMonth = '03'
currentYear = '2020'
start_day = int(currentDay) - 9
end_day = int(currentDay) - 2
# print(start_day)
file_path = Path('C:\\Users\\my_files')


paths = []
l = []
for year in os.listdir(file_path):

    if currentMonth == '01' and start_day < 0:
        file_path = os.path.join(file_path, str(int(currentYear)-1))
    else:
        file_path = os.path.join(file_path, currentYear)

    for month in os.listdir(file_path):

        if start_day < 0:
            file_path = os.path.join(file_path, "0"+str(int(currentMonth)-1)+"\\")

        else:
            file_path = os.path.join(file_path, currentMonth)
        for day in range(start_day, end_day):
            paths.append(os.path.join(file_path, '{:02d}'.format(day)+"\\"))

我开始编写一些if-else条件,但是似乎无法理解如何从文件不是当前月份开始返回路径。

预期输出:

'C:\\Users\\my_files\\2020\\02\\29\\'
'C:\\Users\\my_files\\2020\\03\\01\\'
And so on..

2 个答案:

答案 0 :(得分:1)

很好的问题。日期逻辑可能很难实现,因为可能有许多异常使逻辑复杂化。 Python有一个名为datetime的模块,它使此过程更加容易,因为其他人已经实现了一个月,一年和潜在leap年中有多少天。

借助datetime,您可以轻松度过美好的一天

import datetime
a_week_ago = datetime.datetime.now() - datetime.timedelta(days=7)

现在,您需要将date对象转换为适合您文件结构的字符串。这里有很多选择,这是一个建议:

import datetime

new_date = datetime.datetime.now() - datetime.timedelta(days=7)
prefix = r"C:\\Users\\my_files\\"
new = prefix + new_date.strftime(r"%Y\\%m\\%d\\")
print(new)

然后,您可以将其循环放置并修改日期,使其不是7,而是向后循环。

import datetime

number_of_days = 7
file_path = Path('C:\\Users\\my_files')

for i in range(number_of_days):
  new_date = datetime.datetime.now() - datetime.timedelta(days=i)
  year = new_date.strftime("%Y")
  month = new_date.strftime("%m")
  day = new_date.strftime("%d")

  file_path = os.path.join( year, month, day)
  print(file_path)

您可以使用here中的指南,了解如何使用strtime格式化日期以获取适当的字符串。

答案 1 :(得分:0)

只是扩展了您的代码..编写了一个函数,返回名称为jump_year的true或false 我只是以leap年为条件。 尝试一下:

currentDay = '05'
currentMonth = '03'
currentYear = '2020'
start_day = int(currentDay) - 9
end_day = int(currentDay) - 1
# print(start_day)
file_path = Path('C:\\Users\\my_files'

paths = []
l = []
for year in os.listdir(file_path):

if currentMonth == '01' and start_day < 0:
    file_path = os.path.join(file_path, str(int(currentYear)-1))
else:
    file_path = os.path.join(file_path, currentYear)

for month in os.listdir(file_path):

    if start_day < 0 and currentMonth in ['10', '11','12']:
        file_path = os.path.join(file_path, "0"+str(int(currentMonth)-1)+"\\")
    elif start_day < 0:
         file_path = os.path.join(file_path, str(int(currentMonth)-1)+"\\")
    else:
        file_path = os.path.join(file_path, currentMonth)
    if int(currentDay) < 9 :
         if currentMonth == '03':
            max_days = 29 if leap_year else 28                             
            for day in range(1, end_day): 
                paths.append(os.path.join(file_path, '{:02d}'.format(day)+"\\"))
            for days in range (max_days, max_days-9-int(currentDay)-1, -1):
                paths.append(os.path.join(file_path, '{:02d}'.format(day)+"\\"))  
         if currentMonth in ['01','02', '04', '06', '08', '09', '11']:
            max_days = 31
            for day in range(1, end_day): 
                paths.append(os.path.join(file_path, '{:02d}'.format(day)+"\\"))
            for days in range (max_days, max_days-9-int(currentDay)-1, -1):
                paths.append(os.path.join(file_path, '{:02d}'.format(day)+"\\")) 
         if currentMonth in ['05', '07', '10','12']:
            max_days = 30
            for day in range(1, end_day): 
                paths.append(os.path.join(file_path, '{:02d}'.format(day)+"\\"))
            for days in range (max_days, max_days-9-int(currentDay)-1, -1):
                paths.append(os.path.join(file_path, '{:02d}'.format(day)+"\\")) 
    else:                              
        for day in range(start_day, end_day):
            paths.append(os.path.join(file_path, '{:02d}'.format(day)+"\\"))