Зачем усекать, когда мы открываем файл в режиме 'w' в python - PullRequest
41 голосов
/ 30 декабря 2010

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

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

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

Ответы [ 8 ]

42 голосов
/ 30 декабря 2010

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

33 голосов
/ 30 декабря 2010

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

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

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

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

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

  1. Научите вас читать документацию.
  2. Понимайте каждую часть кода, которую вы копируете, вставляете откуда-то перед тем, как копировать и вставлять его.

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

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

18 голосов
/ 26 июня 2011

Если вы ПРОЧИТАЕТЕ вопросы, прежде чем задавать их, он ответит на них:

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

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

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

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

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

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

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

Он также ТОЧНО заявляет, что хочет, чтобы вы обратили внимание на детали. Каждая мелочь имеет значение.

11 голосов
/ 06 августа 2015

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

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

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

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

6 голосов
/ 21 ноября 2012

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

1 голос
/ 30 декабря 2010

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

0 голосов
/ 20 мая 2019

Сценарий:
Я делал вымогатель и мне нужно было зашифровать файл. Моя цель - не зашифровать файл целиком, а настолько, чтобы только испортить его, потому что я хочу, чтобы он был быстрым в том, что он делает, и поэтомуВремя на шифрование всего этого, поэтому я решил редактировать только некоторые тексты.
Теперь, если я использую write , тогда моя цель здесь разрушена, потому что мне пришлось бы записать файл от 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 года.:)

0 голосов
/ 31 декабря 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...