Как мне сделать это в Python (управление файлами)? - PullRequest
0 голосов
/ 27 мая 2010

У меня есть куча файлов HTML в папке HTML. Эти HTML-файлы содержат символы Юникода, которые я решил с помощью filter(lambda x: x in string.printable, line). Теперь, как мне записать изменения обратно в исходный файл? Каков наилучший способ сделать это? Каждый HTML-файл имеет размер 30 КБ.

  1 import os, string
  2 
  3 for file in os.listdir("HTML/"):
  4     print file
  5     myfile = open('HTML/' + file)
  6     fileList = myfile.readlines()
  9     for line in fileList:
 10         #print line
 11         line = filter(lambda x: x in string.printable, line)
 12     myfile.close()

Ответы [ 3 ]

3 голосов
/ 27 мая 2010

Используйте модуль fileinput . Позволяет читать и записывать в один и тот же файл на месте:

import fileinput,sys,os
files=[os.path.join('HTML',filename) for filename in os.listdir("HTML/")]
for line in fileinput.input(files, inplace=True):    
    line = filter(lambda x: x in string.printable, line)
    sys.stdout.write(line)
2 голосов
/ 27 мая 2010

Сначала я не понимал, к чему стремится @ ~ unutbu, но после прочтения документации для модуля fileinput я нашел то, чего раньше не видел (выделено мое):

Дополнительная фильтрация на месте: если аргумент ключевого слова inplace = 1 передан к fileinput.input () или к FileInput конструктор, файл перемещен в файл резервной копии и стандарт вывод направляется во входной файл (если файл с тем же именем, что и резервный файл уже существует, он будет заменил молча). Это делает это можно написать фильтр, который переписывает свой входной файл на место. Если задан резервный параметр (обычно в качестве резервной копии = '.'), он определяет расширение для файла резервной копии, и резервный файл остается вокруг; от по умолчанию расширение «.bak» и он удаляется, когда выходной файл закрыто. Фильтрация на месте отключена когда читается стандартный ввод.

Так что я думаю, что его ответ лучше, и это объясняет, почему.

0 голосов
/ 27 мая 2010

Это должно работать в Linux; поддержка в других операционных системах ненадежна (см. ниже).

import os, string

for file in os.listdir("HTML/"):
    print file
    myfile = open('HTML/' + file)
    fileList = myfile.readlines()
    for pos, line in enumerate(fileList):
        line = filter(lambda x: x in string.printable, line) # see note 1
        fileList[pos] = line                                 
    myfile.close()
    myfile = open('HTML/' + file, "wz") # see note 2
    myfile.write("\n".join(fileList))

Примечание 1. Простое назначение line не меняет fileList. Переменные действительно являются метками (ссылками) на объекты: назначение метки изменяет объект, к которому прикреплена метка. Эта строка создает список, которому затем присваивается

Примечание 2. Режим файла "wz" очищает файл при открытии (он должен быть эквивалентом флага O_TRUNC при передаче в open()). Он может быть недоступен на платформах, отличных от Linux.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...