Python脚本不会在linux上创建文本文件

时间:2016-12-19 14:21:49

标签: python linux python-2.6

我有一个脚本来查找3个月前创建的目录(在OperDir中),以及一年前创建的目录(DelDir)。它需要dirnames并使用这些dirnames创建一个.txt文件。它在Windows上正常工作,但不在Linux上创建文件,即使在root下也是如此。这可能是权限或其他问题吗?这是代码:

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新手。

感谢您的帮助。

1 个答案:

答案 0 :(得分: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)