2017-01-16 6 views
0

Есть 1000 файлов поверх html.Могу ли я читать и перезаписывать, используя «open» только один раз?

Я хочу сделать:

  • чтения файла.
  • отделка конкретной линии.
  • Запишите файл (не добавляйте).

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

for file_path in glob.glob(os.path.join(dir, '*.html')): 
    with open(file_path, "r", encoding="utf-8") as reader: 
     html_ = reader.read() 
     replaced = html_.replace("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>", "") 
     with open(file_path, "w", encoding="utf-8") as writer: 
      writer.write(replaced) 

Я пробовал:

  • 'r+': это дополнение.
  • 'w+': read() способ возвращенный ''.

ответ

3

Да, открыть файл в режиме 'r+' и «перемотку» (seek назад, чтобы начать) после прочтения:

with open(file_path, "r+", encoding="utf-8") as f: 
    html_ = f.read() 
    f.seek(0) 
    replaced = html_.replace("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>", "") 
    f.write(replaced) 
    f.truncate() 

Я добавил file.truncate() вызова, а также, потому что вы удаляете данные из файл. Без этого вызова вы не заменили бы все данные в файл, у вас все равно будет len(removed_data) байт в конце.

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

Альтернативой является использование fileinput module; она позволяет заменить содержимое файла в месте с несколько более простым подходом:

import fileinput 

with fileinput.input(file_path, inplace=True, openhook=fileinput.hook_encoded("utf-8")) as f: 
    html_ = f.read() 
    replaced = html_.replace("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>", "") 
    print(replaced, end='') 

С inplace=True, старый файлом перемещается в стороне к <filename>.bak резервному копированию для вас, и печати направляет вывод в новый файл, открытом в оригинале место нахождения.

+0

Что касается эффективности, не лучше ли использовать «FileInput» и изменить его на месте? –

+1

@ JimFasarakis-Hilliard: 'FileInput' создаст отдельный файл и переместит его по старому местоположению. Это не обязательно более эффективно. –

+0

Спасибо. Понимаю. Я понял, что когда я вызываю read(), указатель прогрессирует. И когда я вызываю write(), писатель начинает писать с этого момента. Большое спасибо за ваши понятные объяснения. Я также вызываю truncate(). –

Смежные вопросы