Подтвердить что ты не робот

Зачем усекать, когда мы открываем файл в режиме "w" в python

Я иду через книгу Питона Зида Шоу. В настоящее время я работаю над открытием и чтением разделов файлов. Мне интересно, почему нам нужно делать усечение, когда мы уже открываем файл в режиме "w"?

print "Opening the file..."
target = open(filename, 'w')

print "Truncating the file. Goodbye!"
target.truncate()
4b9b3361

Ответ 1

Это избыточно, так как, как вы заметили, открытие в режиме записи перезапишет файл. Больше информации в разделе " Input and Output " документации Python.

Ответ 2

Итак, Зед Шоу называет truncate() в файле, который уже усечен. Хорошо, это довольно бессмысленно. Почему он это делает? Кто знает!? Спроси его!

Может быть, он делает это, чтобы показать, что метод существует? Может быть, но это было бы довольно глупо, так как мне никогда не нужно было урезать файл за 15 лет в качестве программиста, поэтому ему не место в книжке-новичке.

Может быть, он это делает, потому что он думает, что он должен усечь файл, и он просто не знает, что это бессмысленно?

Может, он намеренно путает новичков? Это соответствовало бы его общему способу действия, который, по-видимому, преднамеренно расшатывает людей совершенно без причины.

Обновление: Причина, по которой он делает это, теперь понятна. В более поздних изданиях он перечисляет этот вопрос как "общий вопрос" в главе и говорит вам идти читать документы. Отсюда следует:

  • Научите читать документацию.
  • Понимайте каждую часть кода, который вы скопируете в папку, прежде чем копировать ее.

Вы можете спорить, если это хороший стиль обучения или нет, я бы не знал.

Количество "Помощи, которую я не понимаю в книге Зед Шоуз", - проблемы на SO сократились, поэтому я не могу сказать, что это хуже, чем любая другая книга, которая, вероятно, означает ее лучше многих.: -)

Ответ 3

Если вы будете ПРОЧИТАТЬ вопросы перед тем, как задать вопрос, он отвечает за него:

Дополнительный кредит: "Если вы чувствуете, что не понимаете этого, вернитесь назад через и использовать трюк комментариев, чтобы получить его в квадрате в вашем уме. Один простой комментарий на английском языке над каждой строкой поможет вам понять, или, по крайней мере, дать вам знать, что вам нужно для исследования больше.

Напишите script, аналогичный последнему упражнению, в котором используются read и argv, чтобы прочитайте только что созданный файл.

В этом файле слишком много повторений. Используйте строки, форматы и ускоряет печать line1, line2 и line3 только одним target.write() вместо 6.

Узнайте, почему нам пришлось передать 'w' в качестве дополнительного параметра для открытия. Подсказка: открыто пытается быть в безопасности, заставляя вас явно сказать, что вы хотите написать файл.

Если вы открываете файл в режиме 'w', тогда вам действительно нужно target.truncate()?

Go прочитайте документы для открытой функции Python и посмотрите, действительно ли это." - Зед Шоу.

Он явно хочет, чтобы вы нашли эти вещи для себя, поэтому его дополнительный кредит важен.

Он также ИСКЛЮЧИТЕЛЬНО заявляет, что он хочет, чтобы вы ОПЛАЧИВАЛИ ВНИМАНИЕ ДЕТАЛИ. Каждая мелочь имеет значение.

Ответ 4

Хотя это не полезно для усечения при открытии в режиме 'w', это полезно в 'r+'. Хотя это и не вопрос ОП, я оставлю это здесь для всех, кто руководит здесь Google, как и я.

Допустим, вы открываете (в режиме 'r+', помните, что режим 'rw' отсутствует) 5-строчный файл json с отступом и модифицируете json.load -ed так, чтобы он был только 3 строками. Если вы target.seek(0) перед записью данных обратно в файл, вы получите 2 строки завершающего мусора. Если вы target.truncate() вы этого не сделаете.

Я знаю, что это кажется очевидным, но я здесь, потому что я исправляю ошибку, которая возникала после того, как объект, который оставался одинакового размера в течение многих лет... сжался из-за изменения алгоритма подписи. (Что не очевидно, так это юнит-тесты, которые я должен был добавить, чтобы предотвратить это в будущем. Я написал свою самую длинную строку документации, объясняющую, почему я тестирую подписание с помощью двух смехотворно вымышленных алгоритмов.)

Надеюсь, это кому-нибудь поможет.

Ответ 5

С помощью truncate() вы можете объявить, сколько файла вы хотите удалить, в зависимости от того, где вы сейчас находитесь в файле. Без параметров truncate() действует как w, тогда как w всегда просто стирает весь файл. Таким образом, эти два метода могут действовать одинаково, но они не обязательно.

Ответ 6

Это просто отражение стандартной семантики posix. см. man fopen (3). Python просто обертывает это.

Ответ 7

Когда вы открываете файл в режиме записи, вы обрезаете оригинал (все, что было до этого, было удалено). Затем все, что вы пишете, добавляется в файл. Проблема в том, что запись хочет добавить информацию с самого начала и вызывает IOError, когда указатель остается в конце. Для этого типа записи вы хотите использовать append (открыть файл с аргументом "a +" ).

Ответ 8

Сценарий:
Я делал вымогатель и мне нужно было зашифровать файл. Моя цель не в том, чтобы зашифровать файл целиком, а только в том, чтобы его испортить, потому что я хочу, чтобы он был быстрым в работе и таким образом экономил время при шифровании всего, поэтому я решил редактировать только текст.
Теперь, если я использую запись, то моя цель здесь уничтожена, потому что мне придется записать файл от a до z. Тогда что я могу сделать?
ну вот усечение можно использовать.

Ниже приведен мой код, который просто берет токен из последних 16 цифр в файле:

with open('saver.txt', 'rb+') as f:
    text_len = len(f.read())
    f.truncate(text_len-16)
    f.close()

Я открываю файл
Усекать только 16 символов из файла, который будет заменен мной позже.
Обратите внимание, что я использую его в режиме только для чтения. Если я использую в режиме записи, файл будет полностью обрезан, и при появлении нашей команды усечения произойдет ошибка.
Отвечая на этот вопрос через 8,4 года. :)