1 of 21

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

2 of 21

Как работать с файлами?

2

файлы

текстовые

двоичные

«plain text»:

  • текст, разбитый на строки;
  • из специальных символов только символы перехода на новую строку
  • любые символы
  • рисунки, звуки, видео, …

Алгоритмизация и программирование, язык Python, 10 класс

© К.Ю. Поляков, Е.А. Ерёмин, 2014 http://kpolyakov.spb.ru

3 of 21

Принцип сэндвича

3

открыть файл

работа с файлом

закрыть файл

хлеб

хлеб

начинка

Fin = open ( "input.txt" )

Fout = open ( "output.txt", "w" )

# здесь работаем с файлами

Fin.close()

Fout.close()

файловые переменные-указатели

"r" - чтение

"w" – запись

"a" – добавление

по умолчанию – на чтение (режим "r")

Алгоритмизация и программирование, язык Python, 10 класс

© К.Ю. Поляков, Е.А. Ерёмин, 2014 http://kpolyakov.spb.ru

4 of 21

Ввод данных

4

Fin = open( "input.txt" )

s = Fin.readline() # "1 2"

Чтение строки:

Чтение строки и разбивка по пробелам:

s = Fin.readline().split() # ["1","2"]

Чтение целых чисел:

s = Fin.readline().split() # ["1","2"]

a, b = int(s[0]), int(s[1])

или так:

a, b = [int(x) for x in s]

или так:

a, b = map( int, s )

Алгоритмизация и программирование, язык Python, 10 класс

© К.Ю. Поляков, Е.А. Ерёмин, 2014 http://kpolyakov.spb.ru

5 of 21

Вывод данных в файл

5

a = 1

b = 2

Fout = open( "output.txt", "w" )

Fout.write ( "{:d} + {:d} = {:d}\n".format(

a, b, a+b) )

Fout.close()

Все данные преобразовать в строку!

!

Алгоритмизация и программирование, язык Python, 10 класс

© К.Ю. Поляков, Е.А. Ерёмин, 2014 http://kpolyakov.spb.ru

6 of 21

Чтение неизвестного количества данных

6

пока не конец файла

прочитать число из файла

добавить его к сумме

Задача. В файле записано в столбик неизвестное количество чисел. Найти их сумму.

Fin = open ( "input.txt" )

sum = 0

while True:

s = Fin.readline()

if not s: break

sum += int(s)

Fin.close()

если конец файла, вернёт пустую строку

Алгоритмизация и программирование, язык Python, 10 класс

© К.Ю. Поляков, Е.А. Ерёмин, 2014 http://kpolyakov.spb.ru

7 of 21

Чтение неизвестного количества данных

7

Задача. В файле записано в столбик неизвестное количество чисел. Найти их сумму.

sum = 0

Fin = open ( "input.txt" )

lst = Fin.readlines()

for s in lst:

sum += int(s)

Fin.close()

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

Алгоритмизация и программирование, язык Python, 10 класс

© К.Ю. Поляков, Е.А. Ерёмин, 2014 http://kpolyakov.spb.ru

8 of 21

Чтение неизвестного количества данных

8

Задача. В файле записано в столбик неизвестное количество чисел. Найти их сумму.

sum = 0

with open ( "input.txt" ) as Fin:

for s in Fin:

sum += int(s)

Не нужно закрывать файл!

!

или так:

sum = 0

for s in open ( "input.txt" ):

sum += int(s)

Алгоритмизация и программирование, язык Python, 10 класс

© К.Ю. Поляков, Е.А. Ерёмин, 2014 http://kpolyakov.spb.ru

9 of 21

Задачи

9

«A»: Напишите программу, которая находит среднее арифметическое всех чисел, записанных в файле в столбик, и выводит результат в другой файл.

«B»: Напишите программу, которая находит минимальное и максимальное среди чётных положительных чисел, записанных в файле, и выводит результат в другой файл. Учтите, что таких чисел может вообще не быть.

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

Алгоритмизация и программирование, язык Python, 10 класс

© К.Ю. Поляков, Е.А. Ерёмин, 2014 http://kpolyakov.spb.ru

10 of 21

Обработка массивов

10

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

В чем отличие от предыдущей задачи?

?

Для сортировки нужно удерживать все элементы в памяти одновременно.

!

Алгоритмизация и программирование, язык Python, 10 класс

© К.Ю. Поляков, Е.А. Ерёмин, 2014 http://kpolyakov.spb.ru

11 of 21

Обработка массивов

11

Ввод массива:

A = []

while True:

s = Fin.readline()

if not s: break

A.append ( int(s) )

Ввод в стиле Python:

s = Fin.read().split()

A = list ( map(int, s) )

Сортировка:

A.sort()

Алгоритмизация и программирование, язык Python, 10 класс

© К.Ю. Поляков, Е.А. Ерёмин, 2014 http://kpolyakov.spb.ru

12 of 21

Обработка массивов

12

Вывод результата:

Fout = open ( "output.txt", "w" )

Fout.write ( str(A) )

Fout.close()

или так:

for x in A:

Fout.write ( str(x)+"\n" )

[1, 2, 3]

1

2

3

или так:

for x in A:

Fout.write ( "{:4d}".format(x) )

1 2 3

Алгоритмизация и программирование, язык Python, 10 класс

© К.Ю. Поляков, Е.А. Ерёмин, 2014 http://kpolyakov.spb.ru

13 of 21

Задачи

13

«A»: В файле в столбик записаны числа. Отсортировать их по возрастанию последней цифры и записать в другой файл.

«B»: В файле в столбик записаны числа. Отсортировать их по возрастанию суммы цифр и записать в другой файл. Используйте функцию, которая вычисляет сумму цифр числа.

«C»: В двух файлах записаны отсортированные по возрастанию массивы неизвестной длины. Объединить их и записать результат в третий файл. Полученный массив также должен быть отсортирован по возрастанию.

Алгоритмизация и программирование, язык Python, 10 класс

© К.Ю. Поляков, Е.А. Ерёмин, 2014 http://kpolyakov.spb.ru

14 of 21

Обработка строк

14

Задача. В файле записано данные о собаках: в каждой строчке кличка собаки, ее возраст и порода:

Мухтар 4 немецкая овчарка

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

пока не конец файла Fin

прочитать строку из файла Fin

разобрать строку – выделить возраст

если возраст < 5 то

записать строку в файл Fout

Алгоритмизация и программирование, язык Python, 10 класс

© К.Ю. Поляков, Е.А. Ерёмин, 2014 http://kpolyakov.spb.ru

15 of 21

Чтение данных из файла

15

Чтение одной строки:

s = Fin.readline()

Разбивка по пробелам:

data = s.split()

Выделение возраста:

sAge = data[1]

age = int ( sAge )

Кратко всё вместе:

s = Fin.readline()

age = int ( s.split()[1] )

Алгоритмизация и программирование, язык Python, 10 класс

© К.Ю. Поляков, Е.А. Ерёмин, 2014 http://kpolyakov.spb.ru

16 of 21

Обработка строк

16

Fin = open ( "input.txt" )

Fout = open ( "output.txt", "w" )

while True:

s = Fin.readline()

if not s: break

age = int ( s.split()[1] )

if age < 5:

Fout.write ( s )

Fin.close()

Fout.close()

Полная программа:

Алгоритмизация и программирование, язык Python, 10 класс

© К.Ю. Поляков, Е.А. Ерёмин, 2014 http://kpolyakov.spb.ru

17 of 21

Обработка строк

17

lst = Fin.readlines()

for s in lst:

age = int ( s.split()[1] )

if age < 5:

Fout.write ( s )

или так:

for s in open ( "input.txt" ):

age = int ( s.split()[1] )

if age < 5:

Fout.write ( s )

или так:

Алгоритмизация и программирование, язык Python, 10 класс

© К.Ю. Поляков, Е.А. Ерёмин, 2014 http://kpolyakov.spb.ru

18 of 21

Задачи

18

«A»: В файле записаны данные о результатах сдачи экзамена. Каждая строка содержит фамилию, имя и количество баллов, разделенные пробелами:

<Фамилия> <Имя> <Количество баллов>

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

«B»: В предыдущей задаче добавить к полученному списку нумерацию, сократить имя до одной буквы и поставить перед фамилией:

П. Иванов

И. Петров

...

Алгоритмизация и программирование, язык Python, 10 класс

© К.Ю. Поляков, Е.А. Ерёмин, 2014 http://kpolyakov.spb.ru

19 of 21

Задачи

19

«C»: В файле записаны данные о результатах сдачи экзамена. Каждая строка содержит фамилию, имя и количество баллов, разделенные пробелами:

<Фамилия> <Имя> <Количество баллов>

Вывести в другой файл данные учеников, которые получили больше 80 баллов. Список должен быть отсортирован по убыванию балла. Формат выходных данных:

П. Иванов 98

И. Петров 96

...

Алгоритмизация и программирование, язык Python, 10 класс

© К.Ю. Поляков, Е.А. Ерёмин, 2014 http://kpolyakov.spb.ru

20 of 21

Конец фильма

20

ПОЛЯКОВ Константин Юрьевич

д.т.н., учитель информатики

ГБОУ СОШ № 163, г. Санкт-Петербург

kpolyakov@mail.ru

ЕРЕМИН Евгений Александрович

к.ф.-м.н., доцент кафедры мультимедийной дидактики и ИТО ПГГПУ, г. Пермь

eremin@pspu.ac.ru

Алгоритмизация и программирование, язык Python, 10 класс

© К.Ю. Поляков, Е.А. Ерёмин, 2014 http://kpolyakov.spb.ru

21 of 21

Источники иллюстраций

21

  1. www.mcdonalds.com
  2. иллюстрации художников издательства «Бином»
  3. авторские материалы

Алгоритмизация и программирование, язык Python, 10 класс

© К.Ю. Поляков, Е.А. Ерёмин, 2014 http://kpolyakov.spb.ru