Замена текста в файле [duplicate]

Если у вас есть ES6 совместимый браузер, вы можете использовать:

Разница между порядком сортировки по возрастанию и убыванию является признаком значение, возвращаемое вашей функцией сравнения:

var ascending = homes.sort((a, b) => Number(a.price) - Number(b.price));
var descending = homes.sort((a, b) => Number(b.price) - Number(a.price));

Вот фрагмент рабочего кода:

var homes = [{
  "h_id": "3",
  "city": "Dallas",
  "state": "TX",
  "zip": "75201",
  "price": "162500"
}, {
  "h_id": "4",
  "city": "Bevery Hills",
  "state": "CA",
  "zip": "90210",
  "price": "319250"
}, {
  "h_id": "5",
  "city": "New York",
  "state": "NY",
  "zip": "00010",
  "price": "962500"
}];

homes.sort((a, b) => Number(a.price) - Number(b.price));
console.log("ascending", homes);

homes.sort((a, b) => Number(b.price) - Number(a.price));
console.log("descending", homes);

41
задан Blankman 28 March 2011 в 00:39
поделиться

5 ответов

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

Его можно моделировать, используя резервный файл как stdlib fileinput module .

Вот пример скрипта, который удаляет строки, которые не удовлетворяют some_condition из файлов, указанных в командной строке, или stdin:

#!/usr/bin/env python
# grep_some_condition.py
import fileinput

for line in fileinput.input(inplace=True, backup='.bak'):
    if some_condition(line):
        print line, # this goes to the current file

Пример:

$ python grep_some_condition.py first_file.txt second_file.txt

В файлах завершения first_file.txt и second_file.txt будут содержаться только строки, которые удовлетворяют предикату some_condition().

40
ответ дан jfs 21 August 2018 в 23:48
поделиться
  • 1
    Методы, которые на самом деле не пишут в середине файла, также мудры, потому что легко сделать модификацию атомарной (то есть, файл не заканчивается частично измененным состоянием, если программа прервана). – L33tminion 17 June 2015 в 18:22
  • 2
    Как получить имя файла в коде? – serv-inc 25 July 2018 в 06:50
  • 3
    Ах, fileinput имеет параметр files, docs.python.org/3/library/fileinput.html – serv-inc 25 July 2018 в 06:51

fileinput module имеет очень уродливый API, я нахожу красивый модуль для этой задачи - in_place , пример для Python 3:

import in_place

with in_place.InPlace('data.txt') as file:
    for line in file:
        line = line.replace('test', 'testZ')
        file.write(line)

Основное отличие от fileinput:

  • Вместо захвата sys.stdout для записи возвращается новый дескриптор файла.
  • Ручка файла поддерживает все стандартные методы ввода-вывода, а не только readline ().
1
ответ дан Alexey Shrub 21 August 2018 в 23:48
поделиться

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

Если вы заменяете байты на байты, содержимое в файл (т. е. если текст, который вы заменяете, имеет ту же длину, что и новая строка, которую вы заменяете), тогда вы можете уйти с ним, но это гнездо шершней, поэтому я бы сэкономил вам хлопот и просто прочитал полный файл, замените содержимое в памяти (или через временный файл) и запишите его снова.

4
ответ дан Karl Nicoll 21 August 2018 в 23:48
поделиться
  • 1
    Режим «rb +» позволяет читать, перемещать и записывать в файл – eyquem 28 March 2011 в 01:10
  • 2
    @eyquem - Хорошо, я уточню свой ответ. – Karl Nicoll 28 March 2011 в 01:15

Вы должны выполнить резервное копирование по размеру строки в символах. Предполагая, что вы использовали readline, вы можете получить длину строки и выполнить резервное копирование, используя:

file.seek(offset[, whence])

Установите значение в SEEK_CUR, установите смещение на -length.

См. Документы Python или посмотрите man-страницу для seek.

0
ответ дан kenorb 21 August 2018 в 23:48
поделиться

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

Для этого вы можете использовать произвольный доступ к файлам с помощью метода seek() объекта file .

В качестве альтернативы вы можете используйте объект mmap для обработки всего файла в качестве изменяемой строки. Имейте в виду, что объекты mmap могут устанавливать максимальный размер файла в диапазоне 2-4 ГБ на 32-битном ЦП, в зависимости от вашей операционной системы и ее конфигурации.

3
ответ дан thkala 21 August 2018 в 23:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: