[英]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.