I have a script to look for directories created 3 month ago (in OperDir), and for directories made a year ago (DelDir). It takes dirnames and creates a .txt files with these dirnames. It works correctly on Windows, but does not create files on Linux, even under the root. Could it be a problem with the permissions or something else? Here is the code:
import os, time, sys
from os.path import join, getsize, isfile, isdir, splitext
import ctypes
import platform
from os import path
import shutil
import logging
from logging import handlers
from datetime import datetime, timedelta
def checkTime(timed):
curr_time = str(time.gmtime())
year_st = curr_time.find('tm_year') + 8
year_fin = curr_time.find('tm_mon') - 2
year = int(curr_time[year_st:year_fin:1])
month_st = curr_time.find('tm_mon') + 7
month_fin = curr_time.find('tm_mday') - 2
month = int(curr_time[month_st:month_fin:1])
day_st = curr_time.find('tm_mday') + 8
day_fin = curr_time.find('tm_hour') - 2
day = int(curr_time[day_st:day_fin:1])
if timed == 'year':
return year
elif timed == 'month':
return month
elif timed == 'day':
return day
def split(path):
head, tail = os.path.split(path)
return tail
def moveFileOperativeTest(pathOper, pathDelete, nameOper):
logfile = open('MovedFilesLog.txt', 'a+')
logfile.write(str(checkTime('day')) + '.' + str(checkTime('month')) + '.' + str(checkTime('year')) + ' - ' + "File '%s' will be moved from '%s' to the '%s'.\n" % (nameOper, pathOper, pathDelete))
logfile.close
'''with open('MovedFilesLog.txt', 'a') as logfile:
logfile.write(checkTime('day') + '.' + checkTime('month') + '.' + checkTime('year') + ' - ' + "File '%s' will be moved from '%s' to the '%s'.\n" % (nameOper, pathOper, pathDelete))
logfile.close()'''
def removeFileTest(pathDelete, nameDelete):
logfile = open('RemovedFilesLog.txt', 'a+')
logfile.write(str(checkTime('day')) + '.' + str(checkTime('month')) + '.' + str(checkTime('year')) + ' - ' + "File '%s' will be removed from '%s' directory.\n" % (nameDelete, pathDelete))
logfile.close
'''with open('RemovedFilesLog.txt', 'a') as logfile:
logfile.write(checkTime('day') + '.' + checkTime('month') + '.' + checkTime('year') + ' - ' + "File '%s' will be removed from '%s' directory.\n" % (nameDelete, pathDelete))
logfile.close()'''
def pathed(pathOper, pathDelete, yearOper, monthOper, dayOper, yearDel, monthDel, dayDel):
for dirname, dirnames, filenames in os.walk(pathOper):
for subdirname in dirnames:
dirpath = os.path.join(dirname, subdirname)
if getCreationDate(dirpath, 'day') == dayOper and getCreationDate(dirpath, 'month') == monthOper and getCreationDate(dirpath, 'year') == yearOper:
nameOper = split(dirpath)
print "opername = " +nameOper
moveFileOperativeTest(pathOper, pathDelete, nameOper)
#moveFileOperative(pathOper, pathDelete, nameOper)
for dirname, dirnames, filenames in os.walk(pathDelete):
for subdirname in dirnames:
dirpath = os.path.join(dirname, subdirname)
if getCreationDate(dirpath, 'day') == dayOper and getCreationDate(dirpath, 'month') == monthOper and getCreationDate(dirpath, 'year') == yearOper:
nameDelete = split(dirpath)
print 'namedel = ' + nameDelete
removeFileTest(pathDelete, nameDelete)
#removeFile(pathDelete, nameDelete)
print 'Done'
def dateCheck(pathOper, pathDelete):
operVar = 92
delVar = 365
operDate = datetime.now() - timedelta(days=operVar)
delDate = datetime.now() - timedelta(days=delVar)
yearOper = int(str(operDate)[0:4:1])
monthOper = int(str(operDate)[5:7:1])
dayOper = int(str(operDate)[8:10:1])
yearDel = int(str(delDate)[0:4:1])
monthDel = int(str(delDate)[5:7:1])
dayDel = int(str(delDate)[8:10:1])
pathed(pathOper, pathDelete, yearOper, monthOper, dayOper, yearDel, monthDel, dayDel)
def getCreationDate(path, timed):
dict_month = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6, 'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
creation = str(time.ctime(os.path.getctime(path)))
month = int(dict_month.get(creation[4:7:1]))
day = int(creation[8:10:1])
year = int(creation[-4::1])
if timed == 'day':
return day
elif timed == 'month':
return month
else:
return year
dateCheck("/opt/***", "/opt/****")
I'm sorry if that's a silly question, I'm new in Python.
Thanks for your help.
The short answer is that it's your use of wildcards (and in fact, too many wildcards):
os.walk
tries to open a directory called/opt/***
, which doesn't exist. If you open/opt/
instead, it works.There are quite a few issues with the code, however, including what happens when you're walking over a directory tree when you're changing it, and also not using the
datetime
attributes to look up day, month and year, but instead doing string and int conversions and slices to extract the information the hard way. May I suggest posting the script on https://codereview.stackexchange.com/questions/tagged/python as well, as a learning experience?An an example of what I mean by the
datetime
comments, this function:Could be replaced with this, which is much clearer:
Or even just passing the
datetime
objects around and looking up the year, month and day when they're needed: