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


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

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

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

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

8   51  

8 ответов:

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

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

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

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

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

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

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

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

использовать 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')

Это не 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()

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

import subprocess

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

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

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

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