Файлы

'file.txt', который используется в примерах выглядит так (в конце есть перевод строки):

1 2 3 wait what 4

Как прочитать файл

Открыть файл на чтение

In [1]:
file_in = open('file.txt', 'r') # Параметр 'r' можно опустить: он используется по умолчанию
                             # Если файл не существует, выпадет исключение (ошибка выполнения)

Второй, более безопасный способ открыть файл — использовать with:

In [2]:
with open('file.txt', 'r') as file_in:
    # Здесь можно читать файл
    pass ## 

Считать всё содержимое в одну строку

In [3]:
with open('file.txt', 'r') as file_in:
    contents = file_in.read()

contents
Out[3]:
'1 2 3\nwait what\n4\n'

Эти странные символы '\n' означают перевод строки

Считать одну или несколько строк файла

In [4]:
with open('file.txt', 'r') as file_in:
    line = file_in.readline()

line
Out[4]:
'1 2 3\n'
In [5]:
line = line.strip() # Избавляемся от символа перевода строки
line
Out[5]:
'1 2 3'

Можно считать не одну строку, а две или сколько угодно

In [6]:
with open('file.txt', 'r') as file_in:
    first_line = file_in.readline()
    second_line = file_in.readline()
    third_line = file_in.readline()

line, second_line, third_line
Out[6]:
('1 2 3', 'wait what\n', '4\n')

Конструкция file_in.readline().strip() аналогична input(), только чтение происходит из файла, а не из стандартного ввода

Считать все строки в список

In [7]:
with open('file.txt', 'r') as file_in:
    lines = file_in.readlines()

lines
Out[7]:
['1 2 3\n', 'wait what\n', '4\n']

Используем генератор списка, чтобы избавиться от символов перевода строки:

In [8]:
lines_stripped = [line.strip() for line in lines]
lines_stripped
Out[8]:
['1 2 3', 'wait what', '4']

Пройтись по всем строкам файла в цикле

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

In [9]:
with open('file.txt', 'r') as file_in:
    for line in file_in: # Обращаемся с файлом, как с итератором: проходимся циклом по всем его элементам
        print(line) # Чтобы не было лишних переносов, нужно использовать strip
1 2 3

wait what

4

Если не использовать with, то после того, как мы закончили работать с файлом, его надо закрыть

In [10]:
file_in = open('file.txt', 'r')
# Здесь делаем что-то с файлом
file_in.close() # Закрываем файл

Как записать в файл

Открыть файл на запись

In [11]:
file_out = open('file_out.txt', 'w') # Если файл существует, он будет перезаписан. Если нет, то будет создан. 

Записать данные

Самый удобный способ — использоваь print() с параметром file:

In [12]:
print('Hello', file=file_out)
print(1, 2, 3, file=file_out)
In [13]:
file_out.close() # В конце нужно обязательно закрыть файл, иначе ничего не запишется

Здесь тоже можно использовать with:

In [14]:
with open('file_out.txt', 'w') as file_out:
    print('Hello', file=file_out)
    print(1, 2, 3, file=file_out)

# Здесь не надо специально закрывать файл, with сделает это за нас

Вместо print() можно использовать file_out.write(), но это менее удобно потому что write() принимает только строку, не ставит переносы строк сам, и ему нельзя настроить параметры sep и end, как в print()

In [15]:
with open('file_out.txt', 'w') as file_out:
    file_out.write('Hello\n') # Перенос строки нужно указывать отдельно