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

Как получить содержимое небольшого файла ascii в python?

Скажем, мы хотим реализовать эквивалент PHP file_get_content.

Какова наилучшая практика? (элегантный и надежный)

Вот какое-то предложение, они правильны?

с помощью инструкции with:

def file_get_contents(filename):
    with file(filename) as f:
        s = f.read()
    return s

использует стандартный open() безопасный?

def file_get_contents(filename):
    return open(filename).read()

Что происходит с дескриптором файла в любом решении?

4b9b3361

Ответ 1

В текущей реализации CPython оба будут обычно закрывать файл. Тем не менее, язык Python не дает такой гарантии для второго - файл в конечном итоге будет закрыт, но финалист может не вызываться до следующего цикла gc. Реализации, такие как Jython и IronPython, будут работать следующим образом, поэтому хорошей практикой будет явное закрытие ваших файлов.

Я бы сказал, что использование первого решения - лучшая практика, хотя open обычно предпочтительнее file. Обратите внимание, что вы можете немного сократить его, если вы предпочитаете краткость второго примера:

def file_get_contents(filename):
    with open(filename) as f:
        return f.read()

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

Ответ 2

Использование оператора with на самом деле является самым лучшим способом убедиться, что файл действительно закрыт.

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

Ответ 3

with убедитесь, что файл закрыт, когда блок оставлен.

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

Ответ 4

import os

def file_get_contents(filename):
  if os.path.exists(filename):
    fp = open(filename, "r")
    content = fp.read()
    fp.close()
    return content

В этом случае он вернет None, если файл не существует, и дескриптор файла будет закрыт до выхода из функции.

Ответ 5

Вы также можете использовать функцию Python v3:

>>> ''.join(open('htdocs/config.php', 'r').readlines())
"This is the first line of the file.\nSecond line of the file"

Подробнее здесь http://docs.python.org/py3k/tutorial/inputoutput.html