Python: seek(0) и open() делают одно и то же?

Итак, я работаю над упражнением 20 «Изучаем Python усердно», и урок знакомит с функцией «seek()» для ссылок на файлы. В данном случае имеем:

def rewind(f):
  f.seek(0)

создание функции для вызова seek(0), что означает создание ссылки на начало файла, используемого в программе. Теперь, в нескольких уроках, мы назначили переменную, которая будет использоваться для открытия файла, в данном случае current_file = open(input_file).

Мой вопрос заключается в том, будет ли использование поиска для открытия файла с самого начала с помощью (0) тем же самым, что и повторное использование команды открытия, например open(current_file). В чем отличия, если они есть? Вот код всего урока:

from sys import argv

script, input_file = argv

def print_all(f):
    print f.read()

def rewind(f):
    f.seek(0)

def print_a_line(line_count, f):
    print line_count, f.readline()

current_file = open(input_file)

print "First let's print the whole file:\n"

print_all(current_file)

print "Now let's rewind, kind of like a tape."

rewind(current_file)

print "Let's print three lines:"

current_line = 1
print_a_line(current_line, current_file)

current_line = current_line + 1
print_a_line(current_line, current_file)

current_line = current_line + 1
print_a_line(current_line, current_file)

person thinksinbinary    schedule 20.10.2016    source источник
comment
Seek не открывает файл, он перематывает текущий файл. Я уверен, что это то, что вы имели в виду, но использование поиска для открытия файла с самого начала с помощью (0) отличается. Вы можете уточнить?   -  person tdelaney    schedule 20.10.2016
comment
кстати open(..., "a") открывает файл и перемещает указатель в конец файла, поэтому он делает seek(0, 2)   -  person furas    schedule 20.10.2016
comment
К сведению: sopython.com/wiki/LPTHW_Complaints   -  person jonrsharpe    schedule 16.03.2017


Ответы (1)


Нет, потому что, как показывает код вашего примера, seek работает на открытом файловый объект, тогда как open работает с файлом имя. Разница немного тонкая, краткий пример может прояснить ее:

f = open('myfile.txt')
f.seek(5) 

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

person all or None    schedule 20.10.2016
comment
Помимо дополнительных накладных расходов, для открытых файлов без имени (возможно, из-за того, что файл был удален сразу после открытия, как в некоторых реализациях tempfile.TemporaryFile), вы не можете повторно открыть его, но можете искать Вернуться к началу. Точно так же для других файловых объектов, таких как gzip.open, простой вызов простого open для fileobj.name не приведет к поведению, эквивалентному поиску назад, потому что у вас будет неправильный обработчик. - person ShadowRanger; 20.10.2016