Как получить содержимое небольшого файла ASCII в Python? - PullRequest
32 голосов
/ 16 сентября 2009

Допустим, мы хотим реализовать эквивалент 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()

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

Ответы [ 5 ]

46 голосов
/ 16 сентября 2009

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

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

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

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

3 голосов
/ 16 сентября 2009

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

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

2 голосов
/ 16 сентября 2009
import os

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

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

2 голосов
/ 16 сентября 2009

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

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

0 голосов
/ 07 июня 2012

Вы также можете использовать функцию 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

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