2016-01-26 2 views
2

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

Я не хочу, чтобы файл открывался все время работы скрипта.

Все, что я когда-либо видел в файле, это * Начать *. Я хочу видеть сообщения об ошибках и сообщение Завершить сообщение. Как это сделать?

log_failed_download_file = open(log_failed_download_filename, "w") 
log_failed_download_file.write ("\n*** Start ***"); 
log_failed_download_file.close() 

# other logic (os.chdir) 

for x in range(start_x, end_x + 1): 
    # do stuff, possibly set download_error to False 
    if (download_error == False): 
     log_failed_download_file = open(log_failed_download_filename, "a") 
     log_failed_download_file .write(url) 
     log_failed_download_file .close() 

# other logic 

log_failed_download_file = open(log_failed_download_filename, "a") 
log_failed_download_file.write ("\n\nComplete - %r" % str(datetime.datetime.now().strftime('%m/%d/%Y %H:%M:%S'))) 
log_failed_download_file.close() 

Edit: Я добавил, что os.chdir находится в «другой логике» отчасти потому, что является источником проблемы.

+0

Вы уверены, что код работает? –

+0

Да. Я только что сделал исправление, которое могло быть причиной вашей озабоченности. –

+1

Если вы печатаете вместо записи в файл, он вызывает эти строки? –

ответ

1

Если log_failed_download_filename только имя файла, изменения текущего рабочего каталога будет меняться, когда вы пишете. Таким образом, вы получаете половину журнала, записанного в одно место, а затем остальные записываются в другое после того, как вы звоните os.chdir.

Чтобы избежать этого, вы можете сделать ваше имя файла в целом FilePath:

log_path = os.path.abspath(log_failed_download_filename) 

Это дает абсолютный путь к файлу. Из документации для os.path.abspath:

Возврат нормализованной абсолютизированной версии пути пути. На большинстве платформ это эквивалентно вызову функции normpath() следующим образом: normpath(join(os.getcwd(), path)).

После того, как вы называете os.chdir, os.getcwd может вернуть что-то другое, так abspath будет также отличаться.

Просто отметим, что современный Python открывает файлы с помощью диспетчера контекстов with. Это автоматически закрывает файлы для вас:

with open(log_path, 'w') as log: 
    log.write("\n*** Start ***") 

# other logic (os.chdir) 

for x in range(start_x, end_x + 1): 
    # do stuff, possibly set download_error to False 
    if not download_error: 
     with open(log_path, 'a') as log: 
      log.write(url) 

# other logic 

with open(log_path, 'a') as log: 
    log.write("\n\nComplete - %r" % 
       str(datetime.datetime.now().strftime('%m/%d/%Y %H:%M:%S'))) 
0

По моим сведениям, функция python для записи файла создает новый файл для записи на него. Поэтому каждый раз, когда вы используете функцию .write, он создает файл и записывает все, что вы вставляете в этот параметр, и если вы используете и существующий файл и записываете на него, он удаляет его исходное содержимое и записывает дополнительную информацию.

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

+2

Они используют флаг ''a'', который добавляется к файлу и не перезаписывается, если файл уже существует. –

+1

Он использует '' '' режим, который добавляется к файлу; это не приведет к стиранию исходного содержимого. –

+0

@PeterWood Извините, я не видел этого. –

0

Вы, вероятно, хотите использовать что-то вроде функции log Снизу:

def main(): 
    a = 1 
    log('my_log.txt', 'Hello', 'World') 
    a += 1 
    log('my_log.txt', 'a =', a) 


def log(path, *objects): 
    with open(path, 'at') as file: 
     print(*objects, file=file) 

if __name__ == '__main__': 
    main()