Перечислите файлы в Python и сохраните их - PullRequest
0 голосов
/ 11 декабря 2011

Я не могу сохранить этот вывод, возможно, у кого-то есть решение. Я перечисляю каталог и некоторые одиночные файлы. Но когда я сохраняю вывод, просто ловлю файлы каталогов, а не одиночные файлы. Мой код:

import os
tosave = open('/tmp/list','ab')
thesource = ["/etc/ssh","/var/log/syslog","/etc/hosts"]
for f in thesource:
    print f
    for top, dirs, files in os.walk(f):
        for nm in files:
            print os.path.join(top, nm)
            try:
                tosave.write(top+nm+'\n')
            finally:
                tosave.close

Я видел в консоли все файлы и каталоги, но в сохраненном списке только файлы ssh. Почему не сохранил системный журнал и хосты тоже?

Спасибо !!

Ответы [ 6 ]

1 голос
/ 13 декабря 2011

С вашей помощью я нашел решение, и оно работает.Я делюсь этим.

tosave = open('/tmp/list','ab')
    thesource = ["/etc/ssh","/var/log/syslog","/etc/hosts"]
for f in thesource:
    if os.path.isfile(f):
        print f
        tosave.write(f+'\n')
    else:
        for top, dirs, files in os.walk(f):
            for nm in files:
                print os.path.join(top, nm)
                tosave.write(top+nm+'\n')

Спасибо всем за помощь !!!

1 голос
/ 11 декабря 2011

Если вы пропустили () на tosave.close во время вставки: (в противном случае проверьте грубый ответ )

Здесь finally неверно.Код в finally будет выполнен после блока try, поэтому после первого выполнения tosave.write(top+nm+'\n') файл будет закрыт из-за tosave.close().

Возможно, вы намеревались использовать except:

            # snip
            try:
                tosave.write(top+nm+'\n')
            except:
                tosave.close()

Редактировать: Чтобы ответить на ваш комментарий, вы хотите, чтобы последняя строка совпадала с оператором печати:

                tosave.write(os.path.join(top, nm) + '\n')
1 голос
/ 11 декабря 2011

Проверьте, работает ли это у вас

import os
tosave = open('/tmp/list','ab')
thesource = ["/etc/ssh","/var/log/syslog","/etc/hosts"]
for f in thesource:
    if os.path.isdir(f):
        for top, dirs, files in os.walk(f):
            for nm in files:
                try:
                    tosave.write(top+nm+'\n')
    if os.path.isfile(f):
        tosave.write(f+'\n')
to.close()
1 голос
/ 11 декабря 2011

Вы можете попробовать добавить tosave.flush() в конце. Это иногда вызывает проблемы. Иногда для сброса содержимого буфера в файл требуется очистка.

0 голосов
/ 11 декабря 2011

Поместите close() в конец скрипта.

В противном случае он закроет файл после первого шага в цикле, сделав файл недоступным для записи.

0 голосов
/ 11 декабря 2011

Может быть, это потому, что вы открываете файл в режиме добавления ('a'), а затем смотрите его начало? Посмотрите на его конец - там могут появиться ваши новые файлы.

В режиме добавления, каждый раз, когда скрипт запускается, добавляет свои выходные данные в файл. Обычно требуется только режим записи ('w' вместо 'a'), который каждый раз перезаписывает файл.

...