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

Самый простой способ чтения/записи содержимого файла в Python

В Ruby вы можете читать из файла, используя s = File.read(filename). Самое короткое и ясное, что я знаю в Python, это

with open(filename) as f:
    s = f.read()

Есть ли другой способ сделать это, чтобы сделать его еще короче (желательно одну строку) и более читабельным?

Примечание: изначально я сформулировал вопрос как "делая это в одной строке кода". Как указывает С.Лотт, короткое не обязательно означает более читабельный. Поэтому я перефразировал свой вопрос, чтобы прояснить, что я имел в виду. Я думаю, что код на Ruby лучше и удобнее для чтения не обязательно потому, что он представляет собой одну строку против двух (хотя это тоже важно), а также потому, что он является методом класса, а не методом экземпляра, который не ставит вопрос о том, кто закрывает файл, как сделать так, чтобы он закрывался, даже если возникло исключение, и т.д. Как указано в ответах ниже, вы можете положиться на GC, чтобы закрыть файл (таким образом, сделав его однострочным), но это делает код еще хуже хотя это короче. Не только из-за непереносимости, но и из-за неясности.

4b9b3361

Ответ 1

Если вы открыты для использования библиотек, попробуйте установить forked-path (с помощью easy_install или pip).

Затем вы можете сделать:

from path import path
s = path(filename).bytes()

Эта библиотека довольно новая, но это вилка библиотеки, которая много лет плавает вокруг Python и использовалась совсем немного. Поскольку я нашел эту библиотеку несколько лет назад, я очень редко использую os.path или open().

Ответ 2

with open('x.py') as f: s = f.read()

*** усмехается ***

Ответ 3

Это то же самое, что и выше, но не обрабатывает ошибки:

s = open(filename, 'r').read()

Ответ 4

Используйте pathlib.

Python 3.5 и выше:

from pathlib import Path
contents = Path(file_path).read_text()

Для более низких версий Python используйте pathlib2:

$ pip install pathlib2

затем

from pathlib2 import Path
contents = Path(file_path).read_text()

Писать так же просто:

Path(file_path).write_text('my text')

Ответ 5

contents = open(filename).read()

Ответ 6

Это не Perl; вы не хотите форсировать множество строк на одном уровне. Напишите функцию, затем вызов функции занимает одну строку кода.

def read_file(fn):
    """
    >>> import os
    >>> fn = "/tmp/testfile.%i" % os.getpid()
    >>> open(fn, "w+").write("testing")
    >>> read_file(fn)
    'testing'
    >>> os.unlink(fn)
    >>> read_file("/nonexistant")
    Traceback (most recent call last):
        ...
    IOError: [Errno 2] No such file or directory: '/nonexistant'
    """
    with open(fn) as f:
        return f.read()

if __name__ == "__main__":
    import doctest
    doctest.testmod()

Ответ 7

Медленный, уродливый, специфичный для платформы... но однострочный; -)

import subprocess

contents = subprocess.Popen('cat %s' % filename, shell = True, stdout = subprocess.PIPE).communicate()[0]

Ответ 8

Просто так:

    f=open('myfile.txt')
    s=f.read()
    f.close()

И делай что хочешь с контентом "с"

Ответ 9

contents = open(filename)

Это дает вам генератор, поэтому вы должны сохранить где-то значения, или

contents = [line for line in open(filename)]

Это делает невозможным сохранение в явном закрытии списка (по крайней мере, с моими знаниями о Python).