прочитать весь файл сразу - PullRequest
       2

прочитать весь файл сразу

4 голосов
/ 24 октября 2011

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

def read_all_1(path):
    f = open(path)
    s = f.read()
    f.close()
    return s

def read_all_2(path):
    with open(path) as f:
        return f.read()

Мои вопросы:

  • какой из них считается более питоническим?
  • во второй функции, файл будет автоматически закрыт с помощью «с»?
  • Есть ли лучший способ, может быть, какая-то встроенная функция?

Ответы [ 2 ]

9 голосов
/ 24 октября 2011

Они оба довольно питонны. Чтобы ответить на ваш второй вопрос, во второй функции файл действительно будет автоматически закрыт. Это часть протокола, используемого с оператором with. По иронии судьбы, файл не гарантированно будет закрыт в первом примере (подробнее о том, почему через секунду).

В конечном счете, я бы выбрал оператор with, и вот почему - в соответствии с PEP 343 :

with EXPR as VAR:
    BLOCK

Переводится на:

mgr = (EXPR)
exit = type(mgr).__exit__  # Not calling it yet
value = type(mgr).__enter__(mgr)
exc = True
try:
    try:
        VAR = value  # Only if "as VAR" is present
        BLOCK
    except:
        # The exceptional case is handled here
        exc = False
        if not exit(mgr, *sys.exc_info()):
            raise
        # The exception is swallowed if exit() returns true
finally:
    # The normal and non-local-goto cases are handled here
    if exc:
        exit(mgr, None, None, None)

Как видите, в этом случае вы получаете большую защиту - ваш файл гарантированно будет закрыт независимо от того, что происходит в промежуточном коде. Это также действительно помогает для удобочитаемости; представьте, если бы вам приходилось помещать этот огромный блок кода каждый раз, когда вы хотите открыть файл!

3 голосов
/ 24 октября 2011

Я скажу второе, и да, файл будет закрыт, представьте себе выражение with так:

try:
   f = open(filepath)
   <code>
finally:
   f.close()

По поводу вашего третьего вопроса нет, нет другого способа, который не предполагает открытие файла.


Третий способ (без явного закрытия файла):

open(filepath).read()

Файл будет закрыт, когда файловый объект будет собирать мусор, но IMHO явное лучше, чем неявное.

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