> For the complete documentation index, see [llms.txt](https://olexsyn.gitbook.io/enote/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://olexsyn.gitbook.io/enote/progr/python/files.md).

# Files & Dirs

* [Python для сетевых инженеров. Работа с файлами](https://pyneng.readthedocs.io/ru/latest/book/07_files/index.html)
* [Файлы в python, ввод-вывод](https://pythonru.com/osnovy/fajly-v-python-vvod-vyvod)
* [Основы работы с файлами в Python](https://tproger.ru/articles/files-in-python/)

## Прочитати увесь файл  <a href="#obychno" id="obychno"></a>

### open / close

конструкція з open - така:

```python
f = open('path_to/file.txt', mode)
text = f.read()  # зчитує увесь файл в один великий рядок
f.close()
print(text)      # 'first string\nsecond string\nthird string\n...'
```

### with <a href="#with" id="with"></a>

Відмінність від `open()`:  з with python самостійно закриває файл, нема необхідності пам’ятати про це. Не викликаються виключення при відкритті файлу (наприклад, якщо файл не існує).

```python
with open('path_to/file', mode) as f:
    text = f.read()
```

### readlines

Корисна функція, яка зчитує рядки файлу **з** `\n` в список:

```python
f = open('r1.txt')
str_list1 = f.readlines()            # кожний ел-нт списку матиме на кінці '...\n'
str_list2 = reversed(f.readlines())  # або зчитати файл в зворотньому порядку
f.close()
```

### read + split

Якщо потрібно отримати рядки файлу, але **без** `\n` в кінці, можна скористатися методом split і як роздільник вказати символ \n:

```python
f = open('r1.txt')
str_list = f.read().split('\n')  # ел-нти списку не матимуть на кінці '\n'
f.close()
```

## modes (режими)

где `mode` - режим работы с файлом: `'r'` - read; `'a'` - append; `'w'` - write

* `'r'` - Открыть файл только для чтения (значение по умолчанию)
* `'w'` - Открыть файл для записи. Если файл существует, то его содержимое удаляется
* `'a'` - Открыть файл для добавления записей. Данные добавляются в конец файла
* `'r+'` - Открыть файл для чтения и записи. Проверь это!
  * если файл существует, то его содержимое удаляется.
  * если файл не существует - будет вызвано исключение.
* `'w+'` - открыть файл для чтения и записи
  * если файл существует, то его содержимое удаляется
  * если файл не существует, то создается новый
* `'a+'` - открыть файл для чтения и записи. Данные добавляются в конец файла
  * если файл существует, что тут?
  * если файл не существует, то что тут?

## Прочитати файл порядково

```python
f = open('r1.txt')
f.readline()  # 'first string\n'
f.readline()  # 'second string\n'
f.close()
```

Але часто нема необхідності у використанні методів read. Напр., цикл for:

```python
f = open('r1.txt')
for line in f:
    print(line)
f.close()
```

## Приклад з виключенням

```python
try:
    fh = open("testfile", "w")
    try:
        fh.write("This is my test file for exception handling!!")
    finally:
        print ("Going to close the file")
        fh.close()
    except IOError:
        print ("Error: can\'t find file or read data")
```

## Робота с двомя файлами одночасно <a href="#rabota-s-dvumya-failami-odnovremenno" id="rabota-s-dvumya-failami-odnovremenno"></a>

```python
with open(fname + '.inp') as f_inp:
    with open(fname + '.out', 'w') as f_out:
        for line in f_inp:
            line = re.sub('\s{4}','\t',line)
            f_out.write(line)
    f_out.close()  # з with можна цього не робити
```
