簡體   English   中英

Python腳本無法在Linux上創建文本文件

[英]Python script doesn't create text file on linux

我有一個腳本來查找3個月前創建的目錄(在OperDir中)和一年前創建的目錄(DelDir)。 它使用目錄名並使用這些目錄名創建一個.txt文件。 它可以在Windows上正常工作,但是即使在根目錄下也不能在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新手。

謝謝你的幫助。

簡短的答案是,這是您使用通配符(實際上,通配符太多):

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

os.walk嘗試打開一個名為/opt/***的目錄,該目錄不存在。 如果您打開/opt/ ,它將起作用。

但是,代碼存在很多問題,包括在更改目錄樹時在目錄樹上行走時會發生什么,並且不使用datetime屬性來查詢日,月和年,而是執行字符串和整數轉換和切片很難提取信息。 我是否可以建議將腳本發布在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)    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM