2014-11-13 2 views
8

Это от exercise 16 от уроков Zed Shaw's Python. Мне трудно понять, что именно делает функция truncate в этом случае. Итак, логика заключается в том, что мы открываем файл, а затем ... сокращаем его? Для чего? Что именно здесь происходит?Поведение метода truncate() в Python

from sys import argv 

script, filename = argv 

print "We're going to erase %r." % filename 
print "If you don't want that, hit CTRL-C (^C)." 
print "If you do want that, hit RETURN." 

raw_input("?") 

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

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

print "Now I'm going to ask you for three lines." 

line1 = raw_input("line 1: ") 
line2 = raw_input("line 2: ") 
line3 = raw_input("line 3: ") 

print "I'm going to write these to the file." 

target.write(line1 + "\n" + line2 + "\n" + line3 + "\n") 

print "And finally, we close it." 
target.close() 
+2

Вы следили за учебным упражнением пять? Что именно вы не понимаете? – jonrsharpe

ответ

15

Вы правы, чтобы быть подозрительными.

Во-первых, file.truncate делает это:

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

Не совсем такой же, как Zed в описании, это только «очищает файл», если текущая позиция является начало файла, но так как мы только что открыли файл (а не в режиме a), текущая позиция - это начало, так что это не имеет значения. Мы обрезаем пустой файл.

Что все хорошо, за исключением того, что open уже делает это:

Наиболее часто используемые значения режима являются 'r' для чтения, 'w' для записи (усечения файл, если он уже существует) ...

Итак, мы открываем файл, создавая его, если он не существует и обрезает его до 0 байтов, если это произойдет. Затем на следующей строке мы обрезаем его до 0 байтов.

(Это «Усечение файл. До свидания!» Сообщение является довольно вводящим в заблуждение, так как мы уже усечены его. Представьте, что вы поставить точку останова на этой линии, и решил убить программу перед выполнением ...)

Но заметьте, что это не какая-то глупая ошибка Зеда; он, кажется, сделал это специально, чтобы сделать точку в исследовании бурильных # 5:

Если открыть файл с режимом 'w', то вы действительно нуждаетесь в target.truncate()? Прочтите документацию для функции open Python и посмотрите, правда ли это.

+1

Помимо того, что это вводит в заблуждение, это также немного снижает переносимость программы без уважительной причины, потому что некоторые старые * nix и некоторые платформы, отличные от Windows/non * nix, не имеют 'truncate' в Python 2.x ... – abarnert

0

В настоящее время я просматриваю книгу Зеда Шоу. Часто. когда он дает вам подобные проблемы, он заставляет вас возиться с различными элементами вашего кода, чтобы увидеть, что они делают. Не стесняйтесь удалять такие вещи, как target.truncate() и повторно запускать программу. Как говорит abarnert, есть способ сделать truncate только удалить часть файла. Оставляя эту дыру в ваших знаниях, о том, как получить разные результаты с этими двумя вариантами, означает раздражать вас в проведении независимых исследований. Это очень эффективный способ заразить читателя любопытством. Посмотрите, как append работает в Python и посмотрите, можете ли вы сделать truncate() удалить только последнюю строку тестового файла. Не бойтесь сломать свой код. «Если вы хотите увеличить свой шанс успеха, удвойте частоту отказов». (Томас Дж. Уотсон, бывший генеральный директор IBM)

Смежные вопросы