как я могу использовать fileinput для редактирования нескольких файлов?

Я использую os.walk в python 2.7, чтобы открыть несколько файлов, затем добавьте все строки, представляющие интерес для этих файлов, в список. Позже я хотел бы отредактировать эти строки с fileinput и закрыть его. Как я могу это достичь? Используя следующий код, я открываю файлы:

import os import fnmatch import fileinput lines = [] def openFiles(): for root, dirs, files in os.walk('/home/test1/'): for lists in fnmatch.filter(files, "*.txt"): filepath = os.path.join(root, lists) print filepath with open(filepath, "r") as sources:#opens 8 files and read their lines #edit = fileinput.input(filepath, inplace=1) for line in sources: if line.startswith('xe') : lines.append(line) 

Затем, для каждой строки, начинающейся с xe, я бы хотел добавить # перед этим, а затем закрыть этот файл. Я хотел бы сделать это в другой функции.

2 Solutions collect form web for “как я могу использовать fileinput для редактирования нескольких файлов?”

Вот как я это делаю, добавляя к вашему коду:

 import os import fnmatch import fileinput def openFiles(dir): filePaths = [] for root, dirs, files in os.walk(dir): for textFile in fnmatch.filter(files, "*.txt"): filepath = os.path.join(root, textFile) filePaths.append(filepath) return filePaths def prefixLines(filepaths, chartoPrefix, prefixWith): res = '' for filepath in filepaths: # Read file with open(filepath, 'r') as f: for line in f: if line.startswith(chartoPrefix): res += prefixWith + line else: res += line # Write to file with open(filepath, 'w') as f: f.write(res) res = '' # Rest res prefixLines(openFiles(r'/home/test1/'), 'xe', '#') 

prefixLines страдает от многих недостатков:

  • Поскольку мы читаем все строки файлов и сохраняем их в res , у нас может закончиться нехватка памяти для больших файлов.

  • Если каким-то образом программист забыл отступ res = '' в правом блоке или если res был полностью опущен, а код работал с фактическими файлами, которые нужны пользователю, вы в конечном итоге записываете содержимое предыдущего файла чтения в следующий файл и последний файл будет содержать все прочитанные файлы. Вот почему вы используете этот код в тестовой среде или используете его с осторожностью.

Этот код служит только для того, чтобы продемонстрировать, как вы могли бы достичь желаемых эффектов, префикс строк файла, который начинается с строки с другой строкой. Поэтому рекомендуется небольшое улучшение этого кода. Например, вместо того, чтобы читать все содержимое файла и сохранять их в res вы могли бы просто сохранить номер строки, который должен быть префикс, и тем самым исключить необходимость загрузки всех данных в память. enumerate также может помочь вернуть номер файла, он возвращает итерабельность в 2.7. Исключая res , мы сохраняем не только память, но и устраняем недостаток в пуле 2.

Я закончил это так. Но я использую классы в своем основном коде, поэтому он разбит на 2 функции вместо одного. В моем основном коде я использовал список для хранения всех путей к файлам и использовал fileinput, чтобы открыть каждый путь for line in fileinput.FileInput(pathlist, inplace=1): do something. из списка таким образом for line in fileinput.FileInput(pathlist, inplace=1): do something. Я благодарю @direprobs за ее ответ, поскольку она пролила некоторый свет на то, как я должен это делать.

 import fnmatch import fileinput import os import sys def openFiles(): for dirpath, dirs, files in os.walk('/home/test1/'): for filename in fnmatch.filter(files, "*.txt"): filepaths = os.path.join(dirpath, filename) for line in fileinput.FileInput(filepaths, inplace=1): if line.startswith("xe"): add = "# {}".format(line) line = line.replace(line, add) sys.stdout.write(line) fileinput.close() openFiles() 
  • 2 раковины 1 стакан. Совместное использование очереди между двумя скриптами Python на малине Pi
  • Matplotlib B1-Motion (движение мыши с нажатой клавишей) эквивалентно?
  • Скрытие командной строки в приложении wxpython
  • PyInstaller не может найти libpython2.7.so при создании двоичного кода?
  • Удаление десериализации огромной строки json для объектов python
  • dateutil.parser.parse () и информация о потерянном часовом поясе
  • Как преобразовать подмножество numpy recarray в непрерывный массив?
  • Многие проблемы с виртуальными виртуальными машинами python
  • django.db.utils.OperationalError: не удалось подключиться к серверу: нет такого файла или каталога
  • Установка pygame с Anaconda
  • Индекс списка вне диапазона при доступе к строке, считываемой из файла CSV
  • Python - лучший язык программирования в мире.