Другое событие 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));
}
К сожалению, нет никакого способа вставить в середину файла, не переписывая его. Как предыдущие плакаты указали, можно добавить в файл или перезаписать часть ее, использование ищет, но если Вы хотите добавить материал вначале или середина, необходимо будет переписать ее.
Это - вещь операционной системы, не вещь Python. Это - то же на всех языках.
то, Что я обычно делаю, читается из файла, сделайте модификации и выпишите его в новый файл, названный myfile.txt.tmp или чем-то как этот. Это лучше, чем чтение целого файла в память, потому что файл может быть слишком большим для этого. Как только временный файл завершается, я переименовываю его то же как исходный файл.
Это - хороший, безопасный способ сделать это потому что, если катастрофические отказы записи файла или аварийные прекращения работы по какой-либо причине, у Вас все еще есть свой нетронутый исходный файл.
Зависит от того, что Вы хотите сделать. Добавлять Вас может открыть его с "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
Перезапись файла на месте часто делается путем сохранения старой копии с измененным именем. Люди 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+"~" )
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 - который мог бы быть огромным.
Модуль 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