#python #file
#python #файл
Вопрос:
Я создал скрипт, который обнаруживает изменения в файлах, расположенных в определенном каталоге. Я пытаюсь записать все эти изменения в changes.txt
файл. Для этой цели я использую sys.stdout = open('changes.txt','w')
инструкцию.
Проблема в том, что всякий раз, когда я запускаю скрипт и изменяю файл в каталоге и сохраняю его, создается пустой вызываемый файл changes.txt
. Этот файл никогда не записывается!
#!/usr/bin/python
import time
import sys
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
sys.stdout = open('changes.txt','w')
class MyHandler(FileSystemEventHandler):
def on_modified(self, event):
print "something happened!"
if __name__ == "__main__":
event_handler = MyHandler()
observer = Observer()
observer.schedule(event_handler, path='.', recursive=False)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
Комментарии:
1. почему бы вам просто не открывать файл регулярно и
f.write()
для него?2. Может быть, было бы лучше переписать вашу функцию печати. В противном случае, как правило, для хранения выходных данных любого скрипта мы используем
python.py > changes.txt
.3. Это сложно… @NilsWerner
4.К вашему сведению, кажется, что он работает, когда я его запускаю. Я запустил скрипт, создал файл и удалил файл, и в итоге получил три
something happened!
строкиchanges.txt
. Вы проверяетеchanges.txt
после завершения работы вашего скрипта? Из-за буферизации вывода вы можете не видеть никаких выходныхchanges.txt
данных, пока файл не будет закрыт.5. Итак, я должен просто вставить это в код и удалить st.dout?
Ответ №1:
Я бы рекомендовал что-то вроде
#!/usr/bin/python
import time
import sys
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
class MyHandler(FileSystemEventHandler):
def __init__(self, f):
self.f = f
def on_modified(self, event):
self.f.write("something happened!n")
self.f.flush()
if __name__ == "__main__":
with open('changes.txt','w') as f:
event_handler = MyHandler(f)
observer = Observer()
observer.schedule(event_handler, path='.', recursive=False)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
как вы можете видеть, контроль над тем, куда будут записаны ваши выходные данные, был передан вызывающему (тому, который создает экземпляр MyHandler
), а не вызываемому ( on_modified
).
Это означает, что вы также можете
event_handler = MyHandler(sys.stdout)
и видеть вывод вместо вывода, помещаемого в файл.
Дополнительное преимущество: используя диспетчер контекста, вы можете быть уверены, что файл закрыт правильно, даже если возникают ошибки.
Комментарии:
1. Большое вам спасибо, но что, если я хочу, чтобы скрипт каждый раз сохранял выходные данные в один и тот же файл, а не записывал поверх старого? А также пронумеруйте, что что-то произошло! например. что-то случилось! #1
2. Добавление к файлам находится в документации Python, а приращение может быть выполнено в
MyHandler
переменной-члене.