繁体   English   中英

使用python代码删除Unix中的旧文件

[英]Delete old files in unix using python code

我下面有python代码,需要检查12天以上的csv文件并删除它们。 但这不是删除文件。 代码有什么问题?

import os, sys, time, glob, datetime
from subprocess import call



file_path = '/export/data/history'
now = time.time()
files = os.listdir(file_path)
os.chdir(file_path)
extension = 'csv'
result = [i for i in glob.glob('*.{}'.format(extension))]
# files = os.path.join(dirs, '')
print(result)
a = 0

def getCurrentTime():
    currentTime=datetime.datetime.now()
    return currentTime

def getTimeDifference(path):
    last_modified_time =datetime.datetime.fromtimestamp(os.path.getmtime(path))
    #print("modifid time = ")
    print("Last modifid Date = "+str(last_modified_time))
    timeDiff = getCurrentTime() - last_modified_time
    return timeDiff

for xfile in result:
    if os.path.isfile( file_path + xfile ):
                d1 = getTimeDifference(file_path + xfile)
                if(d1.days >= 12):
                        os.remove(xfile)
                        a= a+1

print (str(a)+' csv files deleted .')

我正在使用python 3.6

看起来问题在于文件路径的创建方式:

if os.path.isfile( file_path + xfile )

os.remove(xfile)

使用os.path.join代替:

for xfile in result:
    fp = os.path.join(file_path, xfile)
    if os.path.isfile(fp):
        d1 = getTimeDifference(fp)
        if(d1.days >= 12):
            os.remove(fp)

另外,以下行将返回当前工作目录中的所有文件,而不是用file_path变量指定的路径

result = [i for i in glob.glob('*.{}'.format(extension))]

改成:

result = [i for i in glob.glob('{}*.{}'.format(file_path, extension))]

您可以将代码更改为以下内容:

import os
from datetime import datetime, timedelta

FILE_PATH = '/export/data/history'
EXTENSIONS = ('.csv',)
DAYS = 12


def get_time_difference(path):
    return datetime.now() - datetime.fromtimestamp(os.path.getmtime(path))


def remove_old_files(file_path, extensions, n_days):
    deleted_files = {ext: () for ext in extensions}
    day_delta = timedelta(days=n_days)
    for curr_file in filter(lambda x: os.path.splitext(x)[1] in extensions, next(os.walk(file_path))[2]):
        to_delete = os.path.join(file_path, curr_file)
        if get_time_difference(to_delete) >= day_delta:
            os.remove(to_delete)
            deleted_files[os.path.splitext(curr_file)[1]] += (to_delete,)

    return deleted_files


if __name__ == '__main__':
    deleted_files = remove_old_files(FILE_PATH, EXTENSIONS, DAYS)
    for ext, ext_del_files in deleted_files.items():
        print('{} {} files has been deleted.'.format(len(ext_del_files), ext))
        print('\tDeleted files: {}'.format(' '.join(ext_del_files)))

此代码仅取决于osdatetime模块。

os.walk查找输入路径中的所有文件,而filter功能跳过所有扩展名不在所选文件中的文件(在此示例中为'.csv' ); 在这种情况下, os.splitext用于提取每个文件的扩展名。

要确定文件是否足够旧以至于可以删除,将使用timedelta对象。

函数remove_old_files返回一个dict ,该dict为每个扩展包含一个元组以及相应的已删除文件。

我希望这会有所帮助。

使用通用函数的一种更Python化的方法。

from os import path, listdir, remove
from datetime import datetime as dt


def remove_old_files(folder, extension, days_delta):
    now = dt.now()
    files_to_by_extension = [path.join(folder, f) for f in listdir(folder) if
                             f.endswith(extension)]
    removed_files_counter = 0
    for f in files_to_by_extension:
        delta = now - dt.fromtimestamp(path.getmtime(f))
        if delta.days > days_delta:
            try:
                remove(f)
                removed_files_counter += 1
            except OSError:
                pass

    return removed_files_counter


num_of_removed_files = remove_old_files('/tmp', 'txt', 3)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM