【问题标题】:How to move files in a pythonic way?如何以pythonic方式移动文件?
【发布时间】:2020-03-13 14:02:25
【问题描述】:

首先,很抱歉发了这么长的帖子。

我需要将前几天的 .xlsx 文件从一个文件夹移动到另一个文件夹,但我不应该移动今天日期的文件,只移动前几天的文件。

在我当前的代码中,我通过用减 X 天指定每个文件来移动文件,但我认为代码不是最好的“形状”,也不是最好的性能/质量

import datetime,os, glob, shutil
from pathlib import Path

dir_carteiras = r"C:\Users\User\Documents\Carteiras"
test = os.listdir(dir_carteiras)

for item in test:
    if item.endswith(".jpg"):
        os.remove( os.path.join(dir_carteiras, item))

#get todays  date and a calculation for today -1 day
today=datetime.date.today()
minus_one_day=datetime.timedelta(days=-1)

#use the calculation to get previous 5 days strings
d_N1=today+minus_one_day
d_N1_ = d_N1.strftime('%Y.%m.%d')
d_N2=d_N1+minus_one_day
d_N3=d_N2+minus_one_day
d_N4=d_N3+minus_one_day
d_N5=d_N4+minus_one_day

#format dates for the files formats
Date_Carteira_N1 = d_N1.strftime('%d_%m_%Y')
Date_Carteira__0 = today.strftime('%d_%m_%Y')
Date_Carteira_N2 =d_N2.strftime('%d_%m_%Y')
Date_Carteira_N3 =d_N3.strftime('%d_%m_%Y')
Date_Carteira_N4 =d_N4.strftime('%d_%m_%Y')
Date_Carteira_N5 =d_N5.strftime('%d_%m_%Y')
Alocacao_0 = today.strftime('%Y%m%d')
Alocacao_N1 = d_N1.strftime('%Y%m%d')
Alocacao_N2 = d_N2.strftime('%Y%m%d')
Alocacao_N3 = d_N3.strftime('%Y%m%d')
Alocacao_N4 = d_N4.strftime('%Y%m%d')
Alocacao_N5 = d_N5.strftime('%Y%m%d')

#folder destination
NewFolderPath = dir_carteiras+"\Historico"
Path(NewFolderPath).mkdir(parents=True, exist_ok=True)

#Move the "Carteira" files from previous 5 days
Carteiras_move_N1 = glob.glob(r'C:\Users\\Documents\Carteiras\*'+Date_Carteira_N1+'.xlsx', recursive=True)
for f in Carteiras_move_N1:
        shutil.move(f,NewFolderPath)
Carteiras_move_N2 = glob.glob(r'C:\Users\User\Documents\Carteiras\*'+Date_Carteira_N2+'.xlsx', recursive=True)
for f in Carteiras_move_N2:
        shutil.move(f,NewFolderPath)
Carteiras_move_N3 = glob.glob(r'C:\Users\User\Documents\Carteiras\*'+Date_Carteira_N3+'.xlsx', recursive=True)
for f in Carteiras_move_N3:
        shutil.move(f,NewFolderPath)
Carteiras_move_N4 = glob.glob(r'C:\Users\User\Documents\Carteiras\*'+Date_Carteira_N4+'.xlsx', recursive=True)
for f in Carteiras_move_N4:
        shutil.move(f,NewFolderPath)
Carteiras_move_N5 = glob.glob(r'C:\Users\User\Documents\Carteiras\*'+Date_Carteira_N5+'.xlsx', recursive=True)
for f in Carteiras_move_N5:
        shutil.move(f,NewFolderPath)

#Move the "Alocacao" files from the previous 5 days
Alocacao_move_N1 = glob.glob(r'C:\Users\User\Documents\Carteiras\*'+Alocacao_N1+'.xlsx', recursive=True)
for f in Alocacao_move_N1:
        shutil.move(f,NewFolderPath)
Alocacao_move_N2 = glob.glob(r'C:\Users\User\Documents\Carteiras\*'+Alocacao_N2+'.xlsx', recursive=True)
for f in Alocacao_move_N2:
        shutil.move(f,NewFolderPath)
Alocacao_move_N3 = glob.glob(r'C:\Users\User\Documents\Carteiras\*'+Alocacao_N3+'.xlsx', recursive=True)
for f in Alocacao_move_N3:
        shutil.move(f,NewFolderPath)
Alocacao_move_N4 = glob.glob(r'C:\Users\User\Documents\Carteiras\*'+Alocacao_N4+'.xlsx', recursive=True)
for f in Alocacao_move_N4:
        shutil.move(f,NewFolderPath)
Alocacao_move_N5 = glob.glob(r'C:\Users\User\Documents\Carteiras\*'+Alocacao_N5+'.xlsx', recursive=True)
for f in Alocacao_move_N5:
        shutil.move(f,NewFolderPath)

使用 Tylerr 的回答尝试编辑:

import os
import shutil
from datetime import datetime

dir_carteiras = r"C:\Users\GuilhermeMachado\Documents\Carteiras"
test = os.listdir(dir_carteiras)
NewFolderPath = dir_carteiras+"\Historico"

datetime_object = datetime.now()
today = datetime_object.day
month = datetime_object.month
year = datetime_object.year

for file in list(filter(os.path.isfile, os.listdir(dir_carteiras))):
    unix_time = os.path.getmtime(file)
    date = datetime.utcfromtimestamp(unix_time)
    date_day = int(date.strftime("%d"))
    date_month = int(date.strftime("%m"))
    date_year = int(date.strftime("%Y"))
    if date_day < today or date_month < month or date_year < year:
        shutil.move(file, NewFolderPath)

【问题讨论】:

  • 任何带有模式的变量:a1 a2 a3 ... 在任何语言中都是非常糟糕的做法。所以在你做这个“pythonic”之前修复它。
  • 这段代码有效——对吗? ——而你只是想知道如何改进它?有一个名为 Code Review 的单独站点。
  • 谢谢,我会开始做的

标签: python glob shutil


【解决方案1】:

我想你可能在追求这样的东西?

import os
import shutil
from datetime import datetime

datetime_object = datetime.now()
today = datetime_object.day
month = datetime_object.month
year = datetime_object.year

for file in list(filter(os.path.isfile, os.listdir())):
    unix_time = os.path.getmtime(file)
    date = datetime.utcfromtimestamp(unix_time)
    date_day = int(date.strftime("%d"))
    date_month = int(date.strftime("%m"))
    date_year = int(date.strftime("%Y"))
    if date_day < today or date_month < month or date_year < year:
        shutil.move(file, NewFolderPath)

【讨论】:

  • 但这会移动文件夹中的所有文件,即使是今天的日期,对吧?我不应该移动今天的文件
  • 不,你看到if date &lt; today:,所以如果文件的创建日期是 15 日,今天是 16 日,它会移动它,但如果文件是在 16 日创建的,今天是 16 日,它不会。
  • 另外,你可能想对日期做同样的事情,但需要几个月和几年,因为它不会自动这样做;截至目前,它仅按日期执行。
  • 如何更改要移动的文件的路径?
  • for file in list(filter(os.path.isfile, os.listdir())): 上的os.listdir() 内只需定义一个带有路径的字符串。
猜你喜欢
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 2010-11-19
  • 2022-01-08
  • 2015-11-19
  • 1970-01-01
  • 2019-08-18
  • 2018-09-30
相关资源
最近更新 更多