Самый простой способ чтения/записи содержимого файла в Python
В Ruby вы можете читать из файла, используя s = File.read(filename)
. Самое короткое и ясное, что я знаю в Python, это
with open(filename) as f:
s = f.read()
Есть ли другой способ сделать это, чтобы сделать его еще короче (желательно одну строку) и более читабельным?
Примечание: изначально я сформулировал вопрос как "делая это в одной строке кода". Как указывает С.Лотт, короткое не обязательно означает более читабельный. Поэтому я перефразировал свой вопрос, чтобы прояснить, что я имел в виду. Я думаю, что код на Ruby лучше и удобнее для чтения не обязательно потому, что он представляет собой одну строку против двух (хотя это тоже важно), а также потому, что он является методом класса, а не методом экземпляра, который не ставит вопрос о том, кто закрывает файл, как сделать так, чтобы он закрывался, даже если возникло исключение, и т.д. Как указано в ответах ниже, вы можете положиться на GC, чтобы закрыть файл (таким образом, сделав его однострочным), но это делает код еще хуже хотя это короче. Не только из-за непереносимости, но и из-за неясности.
Ответы
Ответ 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).