Как изменить текстовый файл?

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

164
задан martineau 28 July 2017 в 19:12
поделиться

5 ответов

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

Это - вещь операционной системы, не вещь Python. Это - то же на всех языках.

то, Что я обычно делаю, читается из файла, сделайте модификации и выпишите его в новый файл, названный myfile.txt.tmp или чем-то как этот. Это лучше, чем чтение целого файла в память, потому что файл может быть слишком большим для этого. Как только временный файл завершается, я переименовываю его то же как исходный файл.

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

132
ответ дан meagar 23 November 2019 в 21:13
поделиться

Зависит от того, что Вы хотите сделать. Добавлять Вас может открыть его с "a":

 with open("foo.txt", "a") as f:
     f.write("new line\n")

, Если Вы хотите к preprend что-то, которое необходимо читать из файла сначала:

with open("foo.txt", "r+") as f:
     old = f.read() # read everything in the file
     f.seek(0) # rewind
     f.write("new line\n" + old) # write the new line before
98
ответ дан Armin Ronacher 23 November 2019 в 21:13
поделиться

Перезапись файла на месте часто делается путем сохранения старой копии с измененным именем. Люди Unix добавляют ~ для маркировки старого. Люди Windows делают все виды вещей - добавляют .bak или .old - или переименовывают файл полностью или помещают ~ на переднюю сторону имени.

import shutil
shutil.move( afile, afile+"~" )

destination= open( aFile, "w" )
source= open( aFile+"~", "r" )
for line in source:
    destination.write( line )
    if <some condition>:
        destination.write( >some additional line> + "\n" )
source.close()
destination.close()

Вместо shutil, можно использовать следующее.

import os
os.rename( aFile, aFile+"~" )
31
ответ дан S.Lott 23 November 2019 в 21:13
поделиться

mmap модуль Python позволит Вам вставлять в файл. Следующий образец показывает, как он может быть сделан в Unix (Windows mmap может отличаться). Обратите внимание, что это не обрабатывает все состояния ошибки, и Вы могли бы повредить или потерять исходный файл. Кроме того, это не обработает строки unicode.

import os
from mmap import mmap

def insert(filename, str, pos):
    if len(str) < 1:
        # nothing to insert
        return

    f = open(filename, 'r+')
    m = mmap(f.fileno(), os.path.getsize(filename))
    origSize = m.size()

    # or this could be an error
    if pos > origSize:
        pos = origSize
    elif pos < 0:
        pos = 0

    m.resize(origSize + len(str))
    m[pos+len(str):] = m[pos:origSize]
    m[pos:pos+len(str)] = str
    m.close()
    f.close()

также возможно сделать это без mmap с файлами, открытыми в 'r +' режим, но это менее удобно и менее эффективно, поскольку необходимо было бы считать и временно сохранить содержание файла от положения вставки до EOF - который мог бы быть огромным.

14
ответ дан mhawke 23 November 2019 в 21:13
поделиться

Модуль fileinput стандартной библиотеки Python перезапишет файл на месте, если вы используете параметр inplace = 1:

import sys
import fileinput

# replace all occurrences of 'sit' with 'SIT' and insert a line after the 5th
for i, line in enumerate(fileinput.input('lorem_ipsum.txt', inplace=1)):
    sys.stdout.write(line.replace('sit', 'SIT'))  # replace 'sit' and write
    if i == 4: sys.stdout.write('\n')  # write a blank line after the 5th line
67
ответ дан 23 November 2019 в 21:13
поделиться
Другие вопросы по тегам:

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