# Работа с файлами

### Чтение всего файла

Для начала нам понадобится файл с несколькими строками текста. Пусть это будет текстовый файл с текстом-заполнителем "lorem ipsum".

Следующая программа открывает этот файл, читает его и выводит содержимое на экран

```python
with open('file.txt') as file_object:
    contents = file_object.read()

print(contents)
```

Начнем с функции open(). Чтобы выполнить любые операции с файлом - даже просто вывести его содержимое, - сначала необходимо открыть файл. Функция open() получает один аргумент: имя открываемого файла. Python ищет файл с указанным именем в каталоге, в котором находится файл текущей программы. В данном примере выполняется программа main.py, поэтому Python ищет файл file.txt в каталоге, в котором храниться main.py.

Функция open() возвращает объект, представляющий файл. В данном случае open('file.txt') возвращает объект, представляющий файл file.txt. Python сохраняет этот объект в переменной file\_object, с которым мы будем работать позднее в программе.

Конструкция с ключевым словом with закрывает файл после того, как надобность в нем отпадает. Обратите внимание: в этой программе есть вызов open(), но нет вызова close(). Файлы можно открывать и закрывать явными вызовами open() и close(); но если из-за ошибки в программе команда close() останется невыполненной, то файл не будет закрыт. На первый взгляд это не страшно, но некорректное закрытие файлов может привести к потере или порче данных. А если функция close() будет вызвана слишком рано, программа попытается работать с закрытым (то есть недоступным) файлом, что приведет к новым ошибкам. Не всегда можно заранее определить, когда нужно закрывать файл, но с приведенной конструкцией Python сделает это за вас. Вам остается лишь открыть файл и работать с ним так, как требуется, надеясь на то, что Python закроет его автоматически при завершении блока with.

После того, как в программе появится объект, представляющий файл file.txt, во второй строке программы используется функция read(), которая читает всё содержимое файла и сохраняет его в одной длинной строке в переменной contents. При выводе значения contents на экране появляется всё содержимое файла

```
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce urna dolor, hendrerit at rhoncus id, pretium vel libero. Proin tristique viverra lectus, hendrerit egestas orci dapibus sed. Aliquam ac odio sit amet justo imperdiet porttitor. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Sed molestie vulputate ante sit amet ultricies. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vestibulum non odio sed augue condimentum commodo sit amet ac justo.

Proin mi libero, commodo vel mollis in, mattis eu purus. Integer eu sapien sit amet libero sagittis mollis. Maecenas interdum sodales turpis, rhoncus malesuada sem suscipit vel. Cras ut molestie magna. Pellentesque ac diam nec diam fringilla gravida id et risus. Pellentesque semper massa mauris, quis volutpat ex aliquam non. Mauris ornare dolor eget auctor luctus. Duis condimentum tempor molestie. Proin non nibh gravida magna vestibulum commodo id ut magna. Phasellus interdum est nec faucibus ultrices.

```

Единственное различие между выводом и исходным файлом - лишняя пустая строка в конце вывода. Откуда она взялась? Функция read() возвращает ее при чтении, если достигнут конец файла. Если вы хотите удалить лишнюю пустую строку, включите вызов функции rstrip() в вызове функции print()

```python
with open('file.txt') as file_object:
    contents = file_object.read()

print(contents.rstrip())
```

Функция rstrip() удаляет все пропуски в конце строки.

### Пути к файлам

Если передать функции open() простое имя файла, такое как file.txt, Python ищет файл в том каталоге, в котором находится файл, выполняемый в настоящий момент (то есть файл программы .py).

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

Создадим в папке с программой каталог `text_files` и поместим туда файл `file.txt`. В этом случае можно воспользоваться относительным путем (relative path). Относительный путь указывает Python искать файлы в каталоге, который задается относительно каталога, в котором находится текущий файл программы. В нашем примере это может выглядеть так

```python
with open('text_files/file.txt') as file_object:
    contents = file_object.read()

print(contents.rstrip())
```

Запись в строке 1 означает, что файл file.txt следует искать в каталоге text\_files, который находится в том же каталоге, что и файл программы.

Также можно точно определить местонахождение файла в вашей системе независимо от того, где хранится выполняемая программа. Такие пути называются **абсолютными** (absolute path) и используются в том случае, если относительный путь неэффективен или его неудобно прописывать (такое часто бывает, когда файл находится в совершенно других папках, не связанных с программой или проектом).

Абсолютные пути обычно длиннее относительных, поэтому их лучше сохранять в переменных, которые затем передаются функции open()

```python
absolute_path = 'C:/Users/nickg/Documents/working_files/python/file.txt'

with open(absolute_path) as file_object:
    contents = file_object.read()

print(contents.rstrip())
```

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

### Чтение по строкам

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

Для последовательной обработки каждой строки в файле можно воспользоваться циклом for

```python
absolute_path = 'C:/Users/nickg/Documents/working_files/python/file.txt'

with open(absolute_path) as file_object:
    for line in file_object:
        print(line)
```

Обратите внимание, что в этом случае появится много пустых строк. Они появляются из-за того, что каждая строка в текстовом файле завершается невидимым символом новой строки. Функция print() добавляет свой символ новой строки при каждом вызове, поэтому в результате каждая строка завершается двумя символами новой строки: один прочитан из файла, а другой добавлен функцией print(). Вызов rstrip() удаляет лишние пустые строки

```python
absolute_path = 'C:/Users/nickg/Documents/working_files/python/file.txt'

with open(absolute_path) as file_object:
    for line in file_object:
        print(line.rstrip())
```

### Создание списка строк по содержимому файла

При использовании with объект файла, возвращаемый вызовом open(), доступен только в пределах содержащего его блока with. Если вы хотите, чтобы содержимое файла оставалось доступным за пределами блока with, сохраните строки файла в списке внутри блока и в дальнейшем работайте с полученным списком. Одни части файла можно обработать немедленно, а другие отложить для обработки в будущем.

```python
absolute_path = 'C:/Users/nickg/Documents/working_files/python/file.txt'

with open(absolute_path) as file_object:
    lines = file_object.readlines()

for line in lines:
    print(line.rstrip())
```

Функция readlines() последовательно читает каждую строку из файла и сохраняет ее в списке. Список сохраняется в переменной lines, с которой можно продолжить работу после завершения блока with.

### Запись в файл

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

