В Ruby вы можете читать из файла, используя s = File.read(filename)
. Самый короткий и ясный, который я знаю в Python, это
with open(filename) as f:
s = f.read()
Есть ли другой способ сделать это еще короче (желательно на одну строку) и более читабельным?
Примечание: изначально я сформулировал вопрос как «сделать это одной строкой кода». Как указал С.Лотт, короче не обязательно означает более читабельный. Поэтому я перефразировал свой вопрос, чтобы прояснить, что я имел в виду. Я думаю, что код Ruby лучше и читабельнее не обязательно потому, что это одна строка против двух (хотя это тоже имеет значение), но также потому, что это метод класса, а не метод экземпляра, который не ставит вопроса о том, кто закрывает файл, как убедиться, что он закрывается, даже если возникает исключение и т. д. Как указано в ответах ниже, вы можете положиться на GC, чтобы закрыть ваш файл (таким образом, делая его однострочным), но это еще больше ухудшает код правда короче. Не только потому, что он непереносимый, но и из-за того, что это неясно.
with
утверждения в 2.5). Может, способ есть, а может, и нет. Я всегда могу попытаться выяснить, правда? Если вам это не нравится, проголосуйте против и двигайтесь дальше. :)File.readlines("filename")
заключается в том, что он читает содержимое файла по его имени. Нигде в свидетельстве нет дескриптора файла, дескриптора или объекта. Все «эквиваленты» Python, которые я видел, включают явное открытие / закрытие (или, что еще хуже, неявное открытие, которое требует явного закрытия).Ответы:
Если вы готовы использовать библиотеки, попробуйте установить разветвленный путь (с помощью easy_install или pip).
Тогда вы сможете:
from path import path s = path(filename).bytes()
Эта библиотека довольно новая, но это ответвление библиотеки, которая много лет витала вокруг Python и использовалась довольно часто. Так как я нашел это библиотека лет назад, я очень редко использую
os.path
илиopen()
больше.источник
0777
вместо0o0777
), не поддерживается моей текущей версией Python.with open('x.py') as f: s = f.read()
*** усмехается ***
источник
Это то же самое, что и выше, но не обрабатывает ошибки:
s = open(filename, 'r').read()
источник
Используйте pathlib .
Python 3.5 и выше:
from pathlib import Path contents = Path(file_path).read_text()
Для более низких версий Python используйте pathlib2 :
потом
from pathlib2 import Path contents = Path(file_path).read_text()
Писать так же просто:
Path(file_path).write_text('my text')
источник
contents = open(filename).read()
источник
open(...)
мусора. Кто-нибудь поправит меня, если я ошибаюсь.Это не 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]
источник
Вот так просто:
f=open('myfile.txt') s=f.read() f.close()
И делайте все, что хотите, с содержанием "s"
источник
contents = open(filename)
Это дает вам генератор, поэтому вы должны где-то сохранить значения, или
contents = [line for line in open(filename)]
Это делает сохранение для явного закрытия списка невозможным (по крайней мере, с моими знаниями Python).
источник
with
делает). Это невозможно, потому что после завершения итерации поиск файла и его повторное чтение все еще допустимы, что не сработает, если итерация закрыла файл.