Я пытаюсь написать скрипт, который будет перечислять все подкаталоги в каталоге в текстовый файл.

Этот сценарий будет запускаться через 1 час через задание cron, чтобы я мог добавить в текстовый файл, уже созданный в предыдущем запуске, и добавить новые имена подкаталогов.

Например:

/Directory
  /subdir1
  /subdir2
  /subdir3

txt.file должен иметь следующие столбцы:

subdir_name     timestamp   first_filenamein_thatSUBDIR
subdir1         2015-23-12  abc.dcm
subdir2         2014-23-6   ghj.nii
.
.
.

Я знаю, чтобы получить список каталогов, используя os.listdir, но не знаю, как решить эту проблему, так как я хочу написать тот же текстовый файл с новыми именами. Любая идея, как я должен сделать это в Python?

РЕДАКТИРОВАТЬ: С os.listdir я получаю имя подкаталоги, но не отметку времени. И еще одна проблема, как я могу создать два столбца, один с именем подкаталога, а другой с его отметкой времени, как показано выше?

С помощью @ Termi я получил этот код:

import time
import os
from datetime import datetime
parent_dir = '/dicom/'

sub_dirs = os.walk(parent_dir).next()[1]

with open('exam_list.txt','a+') as f:
    lines = f.readlines()
    present_dirs = [line.split('\t')[0] for line in lines]
    for sub in sub_dirs[1:len(sub_dirs)]:
    sub = sub + '/0001'
        latest_modified = os.path.getctime(os.path.join(parent_dir,sub))
        if sub not in present_dirs and time.time() - latest_modified < 4600 :
            created = datetime.strftime(datetime.fromtimestamp(latest_modified),'%Y-%d-%m')
            file_in_subdir = os.walk(os.path.join(parent_dir,sub)).next()[2][1]
            f.write("%s\t%s\t%s\n"%(sub,created,file_in_subdir))

Этот код, набранный на терминале python, хорошо работает со всеми созданными переменными sub, file_in_subdir, имеющими некоторое значение, однако не может записать его в файл, упомянутый в начале кода.

Я также попытался, если запись файла является проблемой, используя следующий код:

with open('./exam_list.txt','a+') as f:
    f.write("%s\t%s\n"%(sub,file_in_subdir))

Выше двух строк создает файл должным образом, как я и хотел ..

Не в состоянии указать, в чем заключается ошибка.

2
learnningprogramming 18 Дек 2015 в 23:08

3 ответа

Лучший ответ

Чтобы получить непосредственные подкаталоги в родительском каталоге, используйте os.walk('path/to/parent/dir').next()[1].

os.walk().next() дает список списков как [current_dir, [sub-dirs], [files]], так что next()[1] дает подкаталоги

Открытие файла с помощью «+» позволит вам как прочитать, так и добавить файл. Затем сохраните подкаталоги, которые уже находятся в файле

with open('dirname.txt','a+') as f:
    lines = f.readlines()
    present_dirs = [line.split('\t')[0] for line in lines]

Теперь для каждого подкаталога проверьте, присутствует ли он уже в списке, и если нет, добавьте его в файл. Если вы выполняете его каждый час, вы можете даже проверить наличие новых файлов, созданных (или измененных в системах Linux) за последний час, используя getctime

time.time() - os.path.getctime(os.path.join(parent_dir,sub)) < 3600

Теперь для любого нового подкаталога используйте os.walk('path/to/subdir').next[2] и получите имена файлов внутри

import time
import os
from datetime import datetime
parent_dir = '/path/to/parent/directory'

sub_dirs = os.walk(parent_dir).next()[1]

with open('dirname.txt','a+') as f:
    lines = f.readlines()
    present_dirs = [line.split('\t')[0] for line in lines]
    for sub in sub_dirs:

        latest_modified = os.path.getctime(os.path.join(parent_dir,sub))

        if sub not in present_dirs and time.time() - latest_modified < 3600 :

            created = datetime.strftime(datetime.fromtimestamp(latest_modified),'%Y-%d-%m')
            file_in_subdir = os.walk(os.path.join(parent_dir,sub)).next()[2][0]
            f.write("%s\t%s\t%s\n"%(sub,created,file_in_subdir))
1
Termi 21 Дек 2015 в 20:21
with open('some.txt', 'a') as output:
    output.write('whatever you want to add')

Открытие файла с 'a' в качестве параметра добавляет в конец все, что вы пишете в него.

1
janrn 18 Дек 2015 в 20:15

Вы можете использовать walk из пакета os. Это лучше, чем listdir. Подробнее об этом вы можете прочитать здесь. En Пример:


import os
from os.path import join, getctime

with open('output.txt', 'w+') as output:

    for root, dirs, files in os.walk('/Some/path/'):
        for name in files:
            create_time = getctime(join(root, name))
            output.write('%s\t%s\t%s\n' % (root, name, create_time))
1
mrvol 21 Дек 2015 в 16:40