Python не может читать файл после truncate [duplicate]

Если вы не инициализировали ссылочный тип и хотите установить или прочитать одно из его свойств, он будет генерировать исключение NullReferenceException.

Пример:

Person p = null;
p.Name = "Harry"; // NullReferenceException occurs here.

Вы можно просто избежать этого, проверив, является ли переменная не нулевой:

Person p = null;
if (p!=null)
{
    p.Name = "Harry"; // Not going to run to this point
}

Чтобы полностью понять, почему выбрано исключение NullReferenceException, важно знать разницу между типами значений и ссылочные типы .

Итак, если вы имеете дело со типами значений, NullReferenceExceptions не может произойти. Хотя вам нужно поддерживать оповещение при работе со ссылочными типами!

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

Типы ссылок (эти должны быть проверены):

  • динамический
  • объект
  • string

Типы значений (вы можете просто игнорировать эти):

  • Числовые типы
  • Интегральные типы
  • Типы с плавающей запятой
  • decimal
  • bool
  • Пользовательские структуры

1
задан Felix Kling 9 April 2011 в 20:06
поделиться

3 ответа

f.write() записывается в собственный буфер процесса Python (аналогично функциям C fwrite()). Однако данные фактически не заливаются в буферы ОС, пока вы не назовете f.flush() или f.close(), или когда буфер заполнится. После этого данные становятся видимыми для всех других приложений.

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

4
ответ дан intgr 4 September 2018 в 07:53
поделиться

По соображениям производительности вывод в файлы буферизуется. Таким образом, данные могут фактически не записываться в файл до тех пор, пока вы не скажете «написать буфер на диск сейчас». Это традиционно выполняется с помощью flush(). truncate(), очевидно, сбрасывается перед усечением.

2
ответ дан kindall 4 September 2018 в 07:53
поделиться

Давайте посмотрим на пример:

import os
# Required for fsync method: see below

f = open("sample.txt", 'w+')
# Opens sample.txt for reading/writing
# File pointer is at position 0

f.write("Hello")
# String "Hello" is written into sample.txt
# Now the file pointer is at position 5

f.read()
# Prints nothing because file pointer is at position 5 & there
# is no data after that

f.seek (0)
# Now the file pointer is at position 0

f.read()
# Prints "Hello" on Screen
# Now the file pointer is again at position 5

f.truncate()
# Nothing will happen, because the file pointer is at position 5
# & the truncate method truncate the file from position 5.     

f.seek(0)
# Now the file pointer  at position 0

f.truncate()
# Trucate method Trucates everything from position 0
# File pointer is at position 0

f.write("World")
# This will write String "World" at position 0
# File pointer is now at position 5     

f.flush()
# This will empty the IOBuffer
# Flush method may or may not work depends on your OS 

os.fsync(f)
# fsync method from os module ensures that all internal buffers
# associated with file are written to  the disk

f.close()
# Flush & close the file object f
4
ответ дан N Randhawa 4 September 2018 в 07:53
поделиться
Другие вопросы по тегам:

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