Как читать и обрабатывать txt-файлы в Python: подробное руководство

Python — язык программирования, который активно используется в различных научных и коммерческих приложениях. Он прост в использовании и обладает мощными возможностями для работы с данными. Работа с текстовыми файлами является одним из ключевых аспектов использования Python для анализа данных.

В этой статье мы рассмотрим, как открыть и обработать txt-файл в Python. Мы научимся читать и записывать данные в файлы, а также проведем некоторую обработку текстовых данных. Кроме того, мы разберемся в использовании библиотеки os для работы с файловой системой и pathlib для работы с путями к файлам.

Мы пошагово рассмотрим все необходимые функции и методы для работы с txt-файлами, описанные в документации Python. Это позволит нашим читателям получить точное представление о том, как работать с файлами в Python и сделать это с максимальной эффективностью.

Как открыть и обработать txt-файл в Python

В Python для открытия и обработки текстового файла используется стандартная функция open(), которая принимает два аргумента — имя файла и режим доступа. Режим доступа может быть «r», «w» или «a», для чтения, записи и добавления соответственно.

Например, чтобы открыть файл для чтения, нужно использовать следующий код:

fileName = "example.txt"

file = open(fileName, "r")

После открытия файла, можно считать его содержимое с помощью функции read():

fileContent = file.read()

Также можно считать файл построчно с помощью функции readline():

fileLine = file.readline()

После обработки файла, его нужно закрыть с помощью функции close(), чтобы освободить ресурсы операционной системы:

file.close()

Для записи в файл используется режим «w». Например, чтобы записать в файл строку, нужно использовать следующий код:

fileName = "example.txt"

file = open(fileName, "w")

file.write("Hello, world!")

file.close()

Если нужно добавить данные в конец файла, нужно использовать режим «a». Например, чтобы добавить строку в конец файла, нужно использовать следующий код:

fileName = "example.txt"

file = open(fileName, "a")

file.write("Hello again, world!")

file.close()

Изучив, как открыть и обработать txt-файл в Python, вы сможете легко работать со своими файлами и обрабатывать их содержимое в своих проектах.

Раздел 1: Подготовка к работе

Перед началом работы с файлами в Python, необходимо подготовить окружение и убедиться в наличии необходимых инструментов.

1. Установка Python

Первый и главный шаг – установка Python. Для работы с файлами рекомендуется использовать Python версии не ниже 3.x.

2. Редактор кода

Для написания и запуска Python-скриптов нужен редактор кода. В качестве такого редактора можно использовать любой популярный текстовый редактор – Sublime Text, Notepad++, Visual Studio Code и т. д.

3. Установка пакета для работы с файлами

Чтобы работать с файлами в Python, нужно установить пакет, предназначенный для работы с файловой системой. В стандартную библиотеку Python входит модуль os, который содержит функции для работы с файлами и директориями. Модуль pathlib предоставляет удобные инструменты для работы с путями к файлам. Более продвинутым инструментом для работы с файлами в Python является библиотека Pandas.

4. Создание и открытие файлов

Прежде чем начать работу с файлами, нужно создать новый файл либо открыть уже существующий файл. Для создания или открытия файла можно использовать функцию open().

5. Основные методы работы с файлами

Основными методами работы с файлами являются:

  • write() – запись данных в файл;
  • read() – чтение данных из файла;
  • close() – закрытие файла.

Шаг 1: Установка Python

Python — интерпретируемый язык программирования, который часто используется для разработки скриптов, создания приложений и веб-сайтов. Для того, чтобы начать программировать на этом языке, необходимо установить его на свой компьютер.

Для установки Python можно скачать установочный файл с официального сайта www.python.org. Необходимо выбрать версию Python, которую вы хотите установить. Обычно рекомендуется выбирать последнюю, наиболее стабильную версию языка. Помните, что версии Python 2.x и Python 3.x несовместимы между собой. Поэтому важно выбирать версию, совместимую с используемыми вами библиотеками и модулями.

После скачивания установочного файла следует запустить его и следовать инструкциям мастера установки. Обычно это не требует сложных действий, и установка Python проходит быстро и без проблем.

Если у вас возникли трудности с установкой Python, необходимо обратиться за помощью к специалистам или использовать облачные IDE, которые уже имеют встроенную поддержку для Python.

Шаг 2: Создание рабочей папки

Перед началом работы необходимо создать рабочую папку, где будут храниться все файлы, связанные с проектом.

Для создания папки можно воспользоваться стандартными средствами операционной системы. Например, в Windows это можно сделать следующим образом:

  • Откройте проводник
  • Перейдите в ту директорию, где хотите создать папку
  • Нажмите правой кнопкой мыши на свободном пространстве в окне проводника
  • Выберите пункт «Новый» -> «Папка»
  • Дайте папке название, например «my_project»

Поместите все файлы, связанные с вашим проектом, в созданную папку. В дальнейшем вы будете обращаться к этой папке из программы на Python.

Раздел 2: Открытие txt-файла

Открытие txt-файла – одна из первых задач, которую необходимо решить, работая с файлами в Python. Для открытия файла используется встроенная функция open(). Она принимает два аргумента: первый – путь к файлу, второй – режим открытия.

Режим открытия файла может быть следующим:

  • r – открыть файл для чтения (значение по умолчанию)
  • w – открыть файл для записи. Существующее содержимое файла будет удалено
  • a – открыть файл для записи. Новое содержимое будет добавлено в конец файла
  • x – открыть файл для записи. Если файл не существует, будет создан новый

Пример использования функции open():

open(‘file.txt’)Открыть файл ‘file.txt’ для чтения
open(‘file.txt’, ‘w’)Открыть файл ‘file.txt’ для записи. Содержимое файла будет удалено
open(‘file.txt’, ‘a’)Открыть файл ‘file.txt’ для записи. Новое содержимое будет добавлено в конец файла
open(‘file.txt’, ‘x’)Открыть файл ‘file.txt’ для записи. Если файл не существует, будет создан новый

Шаг 1: Правильное указание пути к файлу

Прежде чем начать обработку документов, необходимо правильно указать путь к файлу. В случае с txt-файлами это особенно важно, так как можно получить ошибку, если путь указан неправильно.

Классический способ задания пути к файлу — это написание полного пути от корня диска. Например:

file = open(‘C:/Users/Username/Documents/file.txt’)

В данном случае мы задаем полный путь до файла file.txt, который находится в папке Documents, которая находится в папке Username, которая в свою очередь находится в папке Users, которая находится в корне диска C.

Но можно указывать относительный путь, который проще запомнить и использовать:

  • ./file.txt — файл file.txt в текущей директории
  • ../file.txt — файл file.txt в родительской директории
  • ../../file.txt — файл file.txt в двух родительских директориях

Кроме того, если файл находится в той же директории, что и Python-скрипт, можно указать только имя файла:

file = open(‘file.txt’)

В результате этого откроется файл file.txt, находящийся в той же директории, что и Python-скрипт, выполняющий эту команду.

Шаг 2: Открытие файла в режиме чтения

После того, как мы определили, какой файл мы хотим открыть, мы можем начать работать с ним в Python. Для этого необходимо открыть файл в режиме чтения.

Для открытия файла в режиме чтения в Python используется функция open(). Мы можем указать имя файла и режим открытия файла в аргументах функции:

file = open('example.txt', 'r')

Первый аргумент (‘example.txt’) является именем файла, который мы хотим открыть. Второй аргумент (‘r’) означает, что мы открываем файл в режиме чтения.

Если файл с указанным именем не существует, Python выдаст ошибку. Если файл существует и мы имеем права на чтение, то он будет открыт в режиме чтения.

Далее мы можем прочитать содержимое файла, считав его построчно или целиком. Как это сделать, мы рассмотрим в следующих шагах.

Шаг 3: Проверка успешного открытия файла

После того, как мы открыли файл при помощи функции open(), необходимо проверить, был ли файл успешно открыт. Делается это с помощью метода read(), который считывает содержимое файла.

Если при чтении файла возникла ошибка, то будет сгенерировано исключение типа IOError. Обработка ошибок при чтении файлов является важной частью программирования. Необходимо убедиться, что файл был успешно открыт, прежде чем начать обрабатывать его содержимое.

Для проверки успешности открытия файла мы можем использовать условную конструкцию if. Если выполнение программы дошло до этой части кода, значит, файл был успешно открыт. Теперь необходимо прочитать содержимое файла и провести необходимую обработку данных.

  • Прочитаем содержимое файла при помощи метода read():

file = open("file.txt", "r")

if file.readable():

text = file.read()

file.close()

В данном примере мы считываем содержимое файла в переменную text. Для закрытия файла используется метод close(), который необходимо вызывать каждый раз, когда он больше не нужен.

Раздел 3: Обработка текста в файле

После того, как вы открыли текстовый файл в Python, вы можете начать обрабатывать его содержимое. Это может быть полезно, если вам нужно выполнить какую-то обработку или преобразование текста. Например, вы можете разбить текст на отдельные слова, удалить все знаки препинания или произвести замену определенных слов или символов.

Для обработки текста в Python вы можете использовать различные методы и функции. Например, вы можете использовать методы строк, такие как split() для разделения строки на слова или replace() для замены символов в строке. Также вы можете использовать модуль регулярных выражений re для более сложной обработки текста.

Важно помнить, что после обработки текста вам нужно сохранить его в файл. Для этого можно использовать функцию write(), которая записывает содержимое в открытый файл. Кроме того, вы можете использовать файловый указатель, чтобы перемещаться внутри файла и изменять его содержимое в нужных местах.

Некоторые полезные функции для обработки текста в Python:

  • strip() — удаляет пробелы и переносы строк в начале и конце строки.
  • lower() — приводит все символы строки к нижнему регистру.
  • upper() — приводит все символы строки к верхнему регистру.
  • join() — объединяет строки в одну строку, используя определенный разделитель.
  • find() — ищет заданную подстроку в строке и возвращает ее индекс.
  • replace() — заменяет заданный символ или подстроку на другую в строке.

Кроме того, вы можете использовать циклы и условные операторы для создания более сложного кода для обработки текста в файле. Например, вы можете написать цикл, который проходит через каждую строку файла и использует различные методы строк для обработки каждой строки.

Шаг 1: Чтение содержимого файла

Первый шаг в обработке txt-файла в Python — это чтение содержимого файла. Для этого нужно использовать функцию open(), которая открывает файл в режиме чтения (‘r’):

file = open('file.txt', 'r')

Здесь ‘file.txt’ — это имя файла, который вы хотите открыть. Если файл находится в той же папке, что и ваш Python-скрипт, то просто укажите его имя. Если файл находится в другой папке, то укажите полный путь к файлу.

После того, как вы открыли файл, вы можете прочитать его содержимое в переменную, используя метод read():

content = file.read()

Теперь содержимое файла находится в переменной content. Для того, чтобы закрыть файл, используйте метод close():

file.close()

Важно закрыть файл после чтения, чтобы освободить ресурсы и избежать ошибок.

Также можно использовать блок with, который автоматически закрывает файл после использования:

with open('file.txt', 'r') as file:

content = file.read()

В этом случае файл будет закрыт, когда выполнение программы выйдет из блока with.

Шаг 2: Разделение текста на строки

Для работы с текстовыми файлами в Python, нам нужно разделить файл на строки. Каждая строка в текстовом файле заканчивается символом новой строки, который обозначается как «n».

Для разделения текста на строки мы можем использовать метод readlines(). Этот метод возвращает список, где каждый элемент представляет собой строку из нашего текстового файла.

Также мы можем использовать цикл for, чтобы перебрать каждую строку в файле. Например:

  • with open(‘file.txt’) as f:
  •  lines = f.readlines()
  • for line in lines:
  •  print(line)

Этот цикл будет выводить каждую строку файлам поочередно.

Важно помнить, что символ новой строки «n» будет включен в конец каждой строки, так что, если вам нужно обработать каждую строку текста, вы можете использовать метод strip() для удаления символов новой строки.

В общем, разделение текста на строки — это важный шаг при работе с текстовыми файлами в Python. Нужно использовать правильные методы, чтобы обеспечить правильную обработку каждой строки в файле.

Шаг 3: Обработка каждой строки

После того, как мы прочитали файл и получили все его строки, необходимо обработать каждую из них. Для этого можно использовать цикл for.

Переменная, которая возвращает строки из файла, является объектом класса file. Чтобы обработать каждую строку, необходимо вызвать метод readline у этого объекта. Метод readline считывает строку из файла и перемещает указатель на следующую строку, так что при следующем вызове он вернет следующую строку.

Кроме того, можно использовать метод readlines. Он считывает все строки из файла и возвращает список строк.

  • Для использования метода readline в цикле:

with open('file.txt', 'r') as f:

for line in f:

# обрабатываем каждую строку здесь

  • Для использования метода readlines:

with open('file.txt', 'r') as f:

lines = f.readlines()

for line in lines:

# обрабатываем каждую строку здесь

Обработка каждой строки может происходить по-разному, в зависимости от задачи. Для примера, мы можем удалить все пробелы и перевести буквы в верхний регистр:

with open('file.txt', 'r') as f:

for line in f:

processed_line = line.replace(' ', '').upper()

# делаем что-то с processed_line

Это только один из примеров обработки каждой строки. Методы и функции в Python позволяют обрабатывать строки практически любым способом, поэтому всегда следует держать это в голове, когда работаете с текстовыми файлами в Python.

Раздел 4: Модификация и запись в файл

Работа с текстовыми файлами в Python не ограничивается только чтением информации. Часто возникает необходимость изменять файлы, например, записывать новые данные или модифицировать уже существующие. Для этого нужно уметь открывать файл на запись и использовать соответствующие методы для записи данных.

Для открытия файла на запись используется режим ‘w’. При использовании этого режима все данные, которые были записаны в файл ранее, будут удалены, а новые данные будут записаны вместо старых. Если файл не существует, он будет создан автоматически.

Пример:

with open('file.txt', 'w') as file:

file.write('Hello, world!')

В этом примере мы открыли файл ‘file.txt’ в режиме записи и записали в него строку ‘Hello, world!’. Если файл уже существовал, старые данные были удалены и заменены на новые.

Чтобы добавить данные в конец файла, используется режим ‘a’. При использовании этого режима новые данные будут добавлены в конец файла, не удаляя при этом старые данные.

Пример:

with open('file.txt', 'a') as file:

file.write('nThis is a new line.')

В этом примере мы открыли файл ‘file.txt’ в режиме добавления и записали в него новую строку ‘This is a new line.’. Обратите внимание, что мы добавили символ переноса строки ‘n’ перед новой строкой, чтобы она начиналась с новой строки.

Если вы хотите записать в файл данные в определенном формате, то вам может помочь модуль ‘json’. Он позволяет сохранять данные в формате JSON, который может быть легко обработан в других приложениях.

Пример:

import json

data = {

'name': 'John',

'age': 32,

'city': 'New York'

}

with open('data.json', 'w') as file:

json.dump(data, file)

В этом примере мы создали словарь ‘data’, содержащий некоторые данные, и записали его в файл ‘data.json’ в формате JSON с помощью метода ‘dump’ модуля ‘json’.

Также можно использовать методы для форматированной записи данных в файл. Например, метод ‘format’ для строк и метод ‘join’ для списков.

Пример:

with open('file.txt', 'w') as file:

name = 'John'

age = 32

city = 'New York'

file.write('Name: {}n'.format(name))

file.write('Age: {}n'.format(age))

file.write('City: {}n'.format(city))

В этом примере мы создали несколько переменных с данными и записали их в файл ‘file.txt’ с помощью метода ‘write’ и метода ‘format’ для форматирования строк.

Шаг 1: Открытие файла в режиме записи

Первым шагом для работы с текстовым файлом в Python необходимо открыть его при помощи функции `open()`. Эта функция принимает два обязательных аргумента: путь до файла и режим открытия файла. В данном случае мы будем открывать файл в режиме записи.

Для открытия файла в режиме записи необходимо передать вторым аргументом функции `open()` строку `»w»`. Это означает, что мы хотим открыть файл для записи и создать его, если он еще не существует.

Стоит отметить, что при открытии файла в режиме записи все его содержимое будет удалено. Если вы хотите добавить новые данные в конец файла, не удаляя старые, используйте режим `»a»` (append).

Ниже приведен пример кода, демонстрирующий открытие файла в режиме записи:

«`

file = open(«example.txt», «w»)

«`

В этом примере мы открываем файл `»example.txt»` в режиме записи и сохраняем его в переменной `file`. Теперь мы можем использовать эту переменную для записи данных в файл.

Важно не забывать закрывать файл после выполнения всех операций. Для этого достаточно вызвать метод `close()` у переменной, которая содержит открытый файл:

«`

file.close()

«`

Открывать и закрывать файлы нужно обязательно, чтобы избежать утечки ресурсов и ошибок при работе с файлами.

Шаг 2: Модификация текста и запись в файл

После открытия файла и чтения его содержимого, можно перейти к следующему шагу — модификации текста и записи изменений обратно в файл.

Модификация текста может быть разной в зависимости от требуемых задач. Например, можно производить замены определенных слов или символов, удалять или добавлять определенные строки.

Одним из способов изменения текста является использование методов строк Python. Например, метод replace() заменяет одну подстроку на другую, метод strip() удаляет пробелы и символы переноса строки в начале и конце строки, метод split() разбивает строку на список по заданному разделителю.

После внесения изменений необходимо сохранить их в файл. Для этого открываем файл с параметром ‘w’ вместо ‘r’ и записываем измененный текст в него. Важно помнить, что при использовании параметра ‘w’ содержимое файла будет перезаписано, потеряются все предыдущие изменения. Если нужно дописать текст в файл в конец, можно использовать параметр ‘a’.

Пример:

  • Открытие файла:
  • file = open('file.txt', 'r')

  • Чтение содержимого:
  • content = file.read()

  • Внесение изменений:
  • new_content = content.replace('old', 'new')

  • Запись изменений в файл:
  • file = open('file.txt', 'w')

    file.write(new_content)

    file.close()

Шаг 3: Проверка успешной записи в файл

После того, как мы завершили запись данных в txt-файл, необходимо убедиться в успешной операции записи. Для этого мы можем открыть записанный файл на чтение и проверить, что все записанные данные соответствуют ожидаемым.

Для проверки можем использовать метод read(), который позволяет прочитать весь файл. Если все прошло успешно, то данные, которые мы записывали, будут соответствовать содержимому файла.

Например, если мы записывали в файл строку «Hello, world!», то после чтения файла методом read() должны получить эти же данные.

Также можно использовать методы readline() и readlines(), которые считывают по одной строке и по всем строкам соответственно. Эти методы бывают полезны, когда нужно обработать файл построчно.

Если при чтении файла мы обнаружим ошибки или расхождения в данных, то необходимо провести отладку и понять, в чем заключается проблема. Возможно, при записи данных произошла ошибка, либо данные были обработаны некорректно.

Раздел 5: Закрытие файла

Как только мы закончили работать с файлом, важно закрыть его, чтобы освободить ресурсы и предотвратить потерю данных. В Python для этого используется метод close().

Например, если мы открыли файл так:

f = open(«file.txt», «r»)

Мы можем закрыть его так:

f.close()

Этот метод закрывает файл и освобождает все связанные с ним ресурсы. Кроме того, после закрытия файла любые операции записи или чтения из файла будут вызывать ошибки.

Есть несколько способов, как гарантировать, что файл будет закрыт, даже если происходит ошибка в вашем коде. Один из способов — использовать конструкцию try-finally:

try:    f = open(«file.txt»)    # работаем с файлом    finally:        f.close()

В этом случае файл всегда будет закрыт, даже если происходит ошибка в блоке try.

Шаг 1: Закрытие файла после работы

После открытия файла для работы в Python, необходимо закрыть его после завершения всех операций. Это важно для того, чтобы освободить ресурсы, занятые файлом, и предотвратить возможные проблемы при дальнейшей работе программы.

Для закрытия файла в Python используется метод close(), вызываемый на объекте файла. Например, если мы открыли файл в режиме чтения следующим образом:

f = open('file.txt', 'r')

то после чтения данных из файла, необходимо закрыть его, вызвав метод close():

f.close()

Аналогично необходимо закрывать файлы, открытые в режиме записи ('w'), добавления ('a') и других режимах.

Закрытие файла при помощи метода close() является хорошей практикой, которую следует применять в любых программах на языке Python, работающих с файлами.

Раздел 6: Обработка ошибок

При работе с файлами может возникнуть множество ситуаций, когда программа может выдать ошибку. Например, файл может быть удален или не существовать, не хватает прав доступа для чтения или записи и т.д. В таких случаях важно обработать ошибку правильно, чтобы программа не прерывалась и была устойчива к исключениям.

В Python для обработки ошибок используется конструкция try/except, которая позволяет перехватывать и обрабатывать исключения. Например, если файл не существует, можно обработать ошибку и вывести соответствующее сообщение:

try:

with open('myfile.txt', 'r') as f:

print(f.readlines())

except FileNotFoundError:

print('Ошибка: файл не найден')

Кроме того, помимо общих исключений, возможно перехватывать специфические ошибки, например, ошибка доступа к файлу:

try:

with open('myfile.txt', 'w') as f:

f.write('Hello, World!')

except PermissionError:

print('Ошибка: отказано в доступе')

Используя конструкцию try/except, можно обрабатывать ошибки при любых операциях с файлами, включая чтение, запись, закрытие и т.д.

Для более детальной обработки ошибок можно использовать конструкцию try/except/else/finally. Ключевое слово else позволяет выполнить код, если исключение не было выброшено, а finally – выполнить код независимо от того, было выброшено исключение или нет.

Важно обработать все возможные исключения, которые могут возникнуть при работе с файлами, чтобы программа была безопасной и надежной.

Шаг 1: Проверка существования файла

Перед тем как начать работу с txt-файлом в Python, необходимо убедиться, что указанный файл существует в директории. Для этого можно воспользоваться функцией os.path.isfile(), которая проверяет наличие файла в заданной директории.

Пример использования функции:

import os

if os.path.isfile('file.txt'):

    print('Файл существует')

else:

    print('Файл не найден')

В данном случае мы проверяем существование файла ‘file.txt’. Если файл существует, то на экран будет выведено сообщение «Файл существует». Если файла не будет найдено, то будет выведено сообщение «Файл не найден».

Важно убедиться в правильности указания пути к файлу и его имени, чтобы избежать ошибок при работе с файлом.

Шаг 2: Обработка ошибок при открытии/закрытии файла

При работе с файлами необходимо всегда учитывать возможность возникновения ошибок при открытии или закрытии файла. Чтобы программы не прерывались при возникновении ошибок, рекомендуется использовать обработку исключений.

Для обработки ошибок используется конструкция try-except. Она позволяет проверить наличие ошибок в блоке кода и обработать их, не прерывая выполнения программы.

Для открытия файла можно использовать следующий код:

try:

file = open("file.txt", "r")

# Действия с файлом

except FileNotFoundError:

print("Файл не найден")

except IOError:

print("Ошибка при открытии файла")

finally:

file.close()

В данном случае, если файл не найден, будет выведено сообщение «Файл не найден». Если при открытии файла произойдет ошибка, то будет выведено сообщение «Ошибка при открытии файла». В любом случае, файл будет закрыт, благодаря конструкции finally.

Аналогично можно обработать ошибки при закрытии файла:

try:

file = open("file.txt", "r")

# Действия с файлом

finally:

try:

file.close()

except NameError:

pass

except AttributeError:

pass

Если произойдет ошибка при закрытии файла, то она будет обработана и выполнение программы будет продолжено.

Шаг 3: Обработка ошибок при чтении и записи файла

Когда мы работаем с файлами, мы не можем гарантировать, что файл, который мы пытаемся обработать, существует в нужной директории или доступен для чтения/записи. Поэтому важно уметь обрабатывать ошибки, которые могут возникнуть при чтении и записи файлов в Python.

Для того, чтобы обработать ошибки при чтении файла, можно использовать конструкцию try-except. Если файл не существует, то Python вызовет исключение FileNotFoundError. Мы можем обработать его при помощи конструкции try-except. Если при работе с файлом возникнут другие ошибки, то они будут также обработаны этой же конструкцией.

Чтобы обработать ошибки при записи в файл, мы также можем использовать конструкцию try-except. Если файл, в который мы пытаемся записать данные, не существует или не может быть записан, Python вызовет исключение IOError. Мы можем обработать его при помощи конструкции try-except и вывести ошибку или предложить пользователю ввести другой путь для записи.

Важно помнить, что при обработке ошибок нужно предусмотреть все возможные исходы и не допустить прерывания работы программы из-за необработанной ошибки.

Следует также учитывать, что при работе с большими файлами могут возникнуть другие ошибки, связанные с нехваткой памяти. В этом случае следует уменьшить объем загружаемых данных и использовать генераторы, чтобы сократить объем оперативной памяти, занимаемой программой.

Используя правильный подход к обработке ошибок при работе с файлами, вы сможете создавать более надежные и стабильные программы на Python.

FAQ

Ссылка на основную публикацию
Adblock
detector