2016-12-19 8 views
0

3か月前(OperDir内)に作成されたディレクトリと1年前に作成されたディレクトリ(DelDir)を検索するスクリプトがあります。これはdirnamesを取り、これらのdirnamesで.txtファイルを作成します。 Windowsでは正しく動作しますが、Linux上ではルートの下でもファイルを作成しません。権限やその他の問題に問題はありますか?コードは以下の通りです:PythonスクリプトはLinux上にテキストファイルを作成しません

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/****") 

私は残念ですが、私はPythonの新機能です。

ありがとうございました。

+3

スタックオーバーフローへようこそ!コードをエラーを再現する最小のサンプルに絞ってみてください。良い質問をする方法の詳細については、[MCVEの作成方法](http://stackoverflow.com/help/mcve)を参照してください。 – JETM

+1

datetimeオブジェクトは年、月、日のような属性を持っているので、dateCheck関数はそれらの 'int(str())'呼び出しをすべて避け、 'operDate.month'、' operDateを参照することができます。 year 'であり、checkTimeは 'curr_time = time.gmtime(); curr_time.tm_year' –

+0

どのようなエラーメッセージが表示されますか?質問には常にエラーメッセージ全体を含めてください。 – pts

答えて

1

短い答えは、それはワイルドカード(および実際には、あまりにも多くのワイルドカード)の利用であるということです。

dateCheck("/opt/***", "/opt/****") 

os.walkは存在しません/opt/***というディレクトリを、開こうとします。代わりに/opt/を開くと動作します。

しかし、コードを変更するときにディレクトリツリー上を歩いているときや、datetime属性を使用して日、月、年を検索しているときに何が起こるかなど、コードにはかなりの問題があります代わりに文字列とintの変換とスライスを行い、情報を難なく抽出します。 https://codereview.stackexchange.com/questions/tagged/pythonにスクリプトを投稿することをお勧めしますか?

アン私は、この機能datetimeコメントに何を意味するかの例:

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 dateCheck(pathOper, pathDelete): 
    operVar = 92 
    delVar = 365 
    operDate = datetime.now() - timedelta(days=operVar) 
    delDate = datetime.now() - timedelta(days=delVar) 
    pathed(pathOper, pathDelete, operDate.year, operDate.month, 
     operDate.day, delDate.year, delDate.month, delDate.day) 

あるいは単にdatetimeを渡します必要なときに年月日を探し回っている。

def dateCheck(pathOper, pathDelete): 
    operVar = 92 
    delVar = 365 
    operDate = datetime.now() - timedelta(days=operVar) 
    delDate = datetime.now() - timedelta(days=delVar) 
    pathed(pathOper, pathDelete, operDate, delDate)  
+0

ありがとうございます。それはさらなる学習に非常に役立ちます。 CodeReviewにスクリプトを投稿します optディレクトリについて:dataCheck関数は有効な引数をとりますが、これを*記号で変更しました。引数は既存のディレクトリへの有効なパスです。 –

関連する問題