Чтение файлов и динамическое выполнение скриптов на Python
Основной способ ввода данных из файла в программу Python
Наиболее эффективный метод чтения информации из текстового файла основан на операторе with, который гарантирует корректное закрытие дескриптора даже при возникновении исключения. Этот подход подходит для любых сценариев, где требуется считать данные небольшого или среднего размера.
with open('input.txt', 'r', encoding='utf-8') as file:
data = file.read()путь к path python (путь к python (переменная path))
Здесь open() открывает файл, аргумент 'r' указывает режим чтения, параметр encoding определяет кодировку. После выхода из блока with файл автоматически закрывается. Полученная строка data содержит весь текст файла.
Частая ошибка: забывают указать кодировку, что приводит к UnicodeDecodeError. Решение - всегда явно указывать encoding='utf-8' (или нужную кодировку). Другая проблема: файл может отсутствовать. Обработка исключения FileNotFoundError c помощью try/except позволяет корректно завершить программу.
Как прочитать файл целиком в одну строку?
Метод read() возвращает все содержимое как единую строку. Удобно, когда нужно обработать текст как один блок.
with open('text.txt') as f:
entire = f.read()
print(len(entire))Python pathlib path (использование pathlib в python)
Для больших файлов (сотни мегабайт) этот метод занимает много памяти. Альтернатива - построчное чтение.
Как обработать файл построчно без загрузки всего содержимого?
Использование итерации по объекту файла в цикле for. Каждая итерация возвращает одну строку (вместе с символом новой строки).
with open('log.txt', 'r') as f:
for line in f:
line = line.strip()
# обработка строки
Path python 2 (путь к python 2)
Этот метод эффективен для потоковой обработки логов, больших CSV-файлов и других данных, не помещающихся в оперативную память.
Если файл содержит очень длинные строки (более 1 ГБ), построчное чтение также может быть проблематичным. В таких случаях применяют чтение фиксированными блоками.
Как получить список всех строк файла?
Метод readlines() возвращает список, каждый элемент которого - одна строка. Подходит для небольших файлов, где нужна случайная индексация строк.
with open('lines.txt') as f:
lines = f.readlines()
for idx, line in enumerate(lines, 1):
print(f'{idx}: {line.strip()}')Python site packages path (путь к site-packages в python)
При больших файлах список занимает много памяти. Альтернатива - генератор, возвращающий строки по одной.
Как прочитать файл с помощью модуля Pathlib без явного открытия?
Объект Path из модуля pathlib имеет метод read_text() (для текстовых файлов) и read_bytes() (для бинарных). Это более современный и лаконичный способ.
from pathlib import Path
path = Path('config.json')
content = path.read_text(encoding='utf-8')установка path python (настройка переменной path для python)
Метод не предоставляет контроль над чтением больших файлов - все данные загружаются в память. Нет возможности открыть файл в определённом режиме (например, для бинарного чтения).
Как выполнить код из другого Python-файла (ввести программу в интерпретатор)?
Чтение содержимого файла и передача его в функцию exec(). Этот способ подходит для динамической загрузки конфигураций или плагинов, написанных на Python.
with open('myscript.py', 'r', encoding='utf-8') as f:
code = f.read()
exec(code)Python find directory (поиск директории)
Важно: exec() выполняется в текущем пространстве имён, поэтому переменные и функции, определённые в файле, становятся доступны.
Безопасность: exec() выполняет произвольный код. Никогда не используйте его для файлов из ненадёжных источников. Ошибки в выполняемом коде приведут к исключениям, которые нужно обрабатывать. Также стоит учитывать различие рабочих директорий при относительных импортах.
Как импортировать модуль из другого Python-файла стандартным способом?
Если файл находится в известной директории и оформлен как модуль (содержит определения), его можно импортировать с помощью import. Для этого нужно, чтобы файл лежал в пути поиска модулей (sys.path) или в той же папке.
# Допустим, есть файл mymodule.py с функцией func()
import mymodule
mymodule.func()Python текущая директория (получение текущей рабочей директории в python)
При импорте код файла выполняется один раз (при первом импорте), после чего создаётся объект модуля. Это безопаснее, чем exec, и рекомендуется для повторного использования кода.
Файл должен иметь расширение .py и не содержать синтаксических ошибок. Импорт не подходит, если нужно выполнить файл многократно с изменёнными переменными (тогда требуется перезагрузка модуля через importlib.reload).
Как запустить внешний скрипт Python как отдельный процесс?
Функция subprocess.run() позволяет выполнить любой скрипт в новой среде, передавая аргументы и получая вывод.
import subprocess
result = subprocess.run(['python3', 'external_script.py', '--flag'], capture_output=True, text=True)
print(result.stdout)File does not exist python (проверка существования файла)
Этот метод полностью изолирует выполнение: скрипт работает в собственном процессе, не влияя на пространство имён родительской программы. Используется для запуска сторонних утилит или скриптов с побочными эффектами.
Необходимо указать путь к интерпретатору Python. Вывод ошибок и коды возврата требуют дополнительной обработки. Для простых случаев (например, выполнение текущего файла) subprocess избыточен.
Как прочитать данные из стандартного ввода (sys.stdin) как из файла?
В контексте конвейеров (pipe) или перенаправления ввода из файла (python script.py < data.txt) можно использовать sys.stdin. Он ведёт себя как файловый объект.
import sys
for line in sys.stdin:
print(line.upper())
При прямом запуске скрипта без перенаправления ввода программа будет ждать ввода с клавиатуры. Необходимо проверять, является ли stdin терминалом (sys.stdin.isatty()).
Расширенные примеры ввода данных и программ в Python
Ниже приведены нетривиальные сценарии использования файлового ввода и загрузки кода.
Чтение CSV-файла с обработкой заголовков
import csv
with open('data.csv', newline='', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
print(row['Name'], row['Age'])
Anna 28 Boris 35
Чтение бинарных данных с помощью struct
import struct
with open('binary.dat', 'rb') as f:
# читаем 4 байта как integer (little-endian)
data = f.read(4)
value = struct.unpack('
123456789
Чтение большого файла блоками фиксированного размера
def read_in_chunks(file_path, chunk_size=1024):
with open(file_path, 'rb') as f:
while True:
chunk = f.read(chunk_size)
if not chunk:
break
yield chunk
for chunk in read_in_chunks('large_file.bin'):
process(chunk)
(нет вывода, только обработка)
Динамическая загрузка Python-файла с помощью compile и exec
import compileall, sys
code = compile(open('plugin.py', encoding='utf-8').read(), 'plugin.py', 'exec')
namespace = {}
exec(code, namespace)
namespace['run']() # предполагается, что в файле есть функция run
Plugin executed successfully
Использование модуля importlib для загрузки модуля из строки
import importlib.util, sys
spec = importlib.util.spec_from_file_location('dynamic', '/path/to/script.py')
module = importlib.util.module_from_spec(spec)
sys.modules['dynamic'] = module
spec.loader.exec_module(module)
module.some_function()
Hello from dynamic module
Чтение файла с применением byteorder и mmap
import mmap, os
with open('data.bin', 'r+b') as f:
with mmap.mmap(f.fileno(), 0) as mm:
# Читаем первые 4 байта как int32
value = int.from_bytes(mm[:4], byteorder='little')
print(value)
42
Безопасное чтение конфигурации в формате JSON
import json
from pathlib import Path
try:
config = json.loads(Path('config.json').read_text(encoding='utf-8'))
print(config['database'])
except (FileNotFoundError, json.JSONDecodeError) as e:
print(f'Ошибка загрузки: {e}')
{'host': 'localhost', 'port': 5432}
Чтение нескольких файлов с использованием glob
from pathlib import Path
path = Path('logs')
for file in path.glob('*.log'):
content = file.read_text(encoding='utf-8', errors='ignore')
if 'ERROR' in content:
print(f'{file.name} содержит ошибки')
error.log содержит ошибки server.log содержит ошибки
Выполнение Python-файла с передачей аргументов через command line
import subprocess
# файл script.py ожидает аргумент --name
result = subprocess.run(
['python3', 'script.py', '--name', 'Alice'],
capture_output=True,
text=True,
timeout=10
)
print('stdout:', result.stdout)
print('stderr:', result.stderr)
print('returncode:', result.returncode)
stdout: Hello, Alice! stderr: returncode: 0
Чтение и выполнение кода из файла, находящегося в удалённом репозитории (через urllib)
import urllib.request, ssl
ssl_context = ssl.create_default_context()
url = 'https://raw.githubusercontent.com/user/repo/main/helper.py'
with urllib.request.urlopen(url, context=ssl_context) as response:
code = response.read().decode('utf-8')
exec(code) # крайне небезопасно, только для демонстрации
(выполнение кода из сети)