Основы программирования на Python Каширский / методички / Лабораторная работа № 6 2025 (2)
.pdfРабота с файлами CSV
Одним из распространенных файловых форматов, которые хранят в удобном виде информацию, является формат csv. Каждая строка в файле csv представляет отдельную запись или строку, которая состоит из отдельных столбцов, разделенных запятыми. Собственно, поэтому формат и называется Comma Separated Values. Но хотя формат csv – это формат текстовых файлов, Python для упрощения работы с ним предоставляет специальный встроенный модуль csv.
Рассмотрим работу модуля на примере:
import csv
FILENAME = "users.csv"
users = [ ["Tom", 28], ["Alice", 23], ["Bob", 34]
]
with open(FILENAME, "w", newline="") as file: writer = csv.writer(file) writer.writerows(users)
with open(FILENAME, "a", newline="") as file: user = ["Sam", 31]
writer = csv.writer(file) writer.writerow(user)
В файл записывается двухмерный список – фактически таблица, где каждая строка представляет одного пользователя. А каждый пользователь содержит два поля
– имя и возраст. То есть фактически таблица из трех строк и двух столбцов.
При открытии файла на запись в качестве третьего параметра указывается значение newline="" – пустая строка позволяет корректно считывать строки из файла вне зависимости от операционной системы.
Для записи нам надо получить объект writer, который возвращается функцией csv.writer(file). В эту функцию передается открытый файл. А собственно запись производится с помощью метода writer.writerows(users) Этот метод принимает набор строк. В рассматриваемом примере это двухмерный список.
Если необходимо добавить одну запись, которая представляет собой одномерный список, например, ["Sam", 31], то в этом случае можно вызвать метод writer.writerow(user)
В итоге после выполнения скрипта в той же папке окажется файл users.csv, который будет иметь следующее содержимое:
Tom,28
Alice,23
Bob,34
Sam,31
Для чтения из файла нужно создать объект reader и в цикле перебрать все его строки:
import csv
FILENAME = "users.csv"
with open(FILENAME, "r", newline="") as file: reader = csv.reader(file)
for row in reader: print(row[0], " - ", row[1])
Консольный вывод:
Tom - 28
Alice - 23
Bob - 34
Sam - 31
В рассмотренном примере каждая запись или строка представляла собой отдельный список, например, ["Sam", 31]. Но кроме того, модуль csv имеет специальные дополнительные возможности для работы со словарями. В частности, функция csv.DictWriter() возвращает объект writer, который позволяет записывать в файл. А функция csv.DictReader() возвращает объект reader для чтения из файла. Например:
import csv
FILENAME = "users2.csv"
users = [
{"name": "Tom", "age": 28}, {"name": "Alice", "age": 23}, {"name": "Bob", "age": 34}
]
with open(FILENAME, "w", newline="") as file: columns = ["name", "age"]
writer = csv.DictWriter(file, fieldnames=columns) writer.writeheader()
# запись нескольких строк writer.writerows(users)
user = {"name" : "Sam", "age": 41}
# запись одной строки writer.writerow(user)
with open(FILENAME, "r", newline="") as file:
reader = csv.DictReader(file) for row in reader:
print(row["name"], "-", row["age"])
Запись строк также производится с помощью методов writerow() и writerows(). Но теперь каждая строка представляет собой отдельный словарь, и кроме того, производится запись и заголовков столбцов с помощью метода writeheader(), а в метод csv.DictWriter в качестве второго параметра передается набор столбцов.
При чтении строк, используя названия столбцов, можно обратиться к отдельным значениям внутри строки: row["name"].
Работа с бинарными файлами
Бинарные файлы в отличие от текстовых хранят информацию в виде набора байт. При открытии бинарного файла на чтение или запись также надо учитывать, что нужно применять режим "b" в дополнение к режиму записи ("w") или чтения ("r").
При получаем файл в виде набора байт, и наоборот, при записи в метод write() передается набор байт. Например, скопируем файл:
FILENAME = "forest.png" |
# файл для чтения |
NEWFILENAME = "forest_new.png" |
# файл для записи |
image_data = [] # список для хранения считанных данных
#считываем файл в список image_data with open(FILENAME, "rb") as file:
image_data = file.read()
#запись выше считанных байт в новый файл with open(NEWFILENAME, "wb") as file:
file.write(image_data)
print(f"Файл {FILENAME} скопирован в {NEWFILENAME}")
Считывает файл, путь к которому хранится в переменной FILENAME. В данном случае это файл изображения "forest.png". Считанные байты помещаются в список image_data. Затем этот список записываем в файл с именем NEWFILENAME. Таким образом, копируется содержимое одного файла в другой.
Также для работы с бинарными файлами Python предоставляет специальный встроенный модуль pickle, который упрощает работу с бинарными файлами. Этот модуль предоставляет два метода:
•dump(obj, file): записывает объект obj в бинарный файл file
•load(file): считывает данные из бинарного файла в объект Допустим, надо сохранить значения двух переменных:
import pickle
FILENAME = "user.dat"
name = "Tom"
age = 19
with open(FILENAME, "wb") as file: pickle.dump(name, file) pickle.dump(age, file)
with open(FILENAME, "rb") as file: name = pickle.load(file)
age = pickle.load(file)
print("Имя:", name, "\tВозраст:", age)
С помощью функции dump последовательно записываются два объекта. Поэтому при чтении файла также последовательно посредством функции load считываются эти объекты. Консольный вывод программы:
Имя: Tom Возраст: 28
Подобным образом можно сохранять и извлекать из файла наборы объектов:
import pickle
FILENAME = "users.dat"
users = [
["Tom", 28, True], ["Alice", 23, False], ["Bob", 34, False]
]
with open(FILENAME, "wb") as file: pickle.dump(users, file)
with open(FILENAME, "rb") as file: users_from_file = pickle.load(file) for user in users_from_file:
print("Имя:", user[0], "\tВозраст:", user[1], "\tЖенат/замужем:", user[2])
В зависимости от того, какой объект записывался функцией dump, тот же объект будет возвращен функцией load при считывании файла.
Консольный вывод:
Имя: Tom Возраст: 28 Женат/замужем: True Имя: Alice Возраст: 23 Женат/замужем: False Имя: Bob Возраст: 34 Женат/замужем: False
Использование модуля os для работы с файловой системой
Модуль os имеет ряд методов, которые можно использовать для работы с файлами:
1.rename(имя_файла, новое_имя_файла) – переименовывает файл:
>>>f= open ( 'text2.txt' )
>>>f.readlines()
'First line\nSecond line\nThrid line\n'
>>> f= open ( 'text3.txt' )
FileNotFoundError: [Errno 2] No such file or directory: 'text3.txt'
Фрагмент кода показывает, что файл text2.txt содержит данные, а файла text3.txt
нет.
Теперь с помощью метода rename() модуля os переименуем файл text2.txt в файл text3.txt
>>>f.close()
>>>import os
>>>os.rename( 'text2.txt' , 'text3.txt' )
ипопытается открыть файлы text2.txt и text3.txt и прочитать из них данные:
>>>f= open ( 'text2.txt' )
FileNotFoundError: [Errno 2] No such file or directory: 'text2.txt'
>>>open ( 'text3.txt' )
>>>f.readlines()
'First line\nSecond line\nThrid line\n'
>>> f.close()
Результаты подтверждают правильность работы функции rename() по переименованию файлов;
2.remove(имя_файла) – удаляет указанный файл:
>>>os.remove( 'text3.txt' )
>>>open ( 'text3.txt' )
FileNotFoundError: [Errno 2] No such file or directory: 'text3.txt' ;
3.getcwd() – возвращает путь к текущему каталогу, например:
>>> os.getcwd() 'F:\\DISK_D\\PYTHON\\LAB' ;
4. chdir(путь) – сделать каталог, указанный аргументом, текущим каталогом, например:
>>>os.chdir('F:\\DISK_D\\PYTHON')
>>>os.getcwd()
'F:\\DISK_D\\PYTHON' ;
5. listdir(путь) – возвращает в виде списка содержимое указанного каталога (если путь не задан – текущего):
>>> os.listdir()
['LAB', 'LAB.rar', 'python', 'Python_book', 'SAMPLES', 'THEORY', 'ТЕОРИЯ'] ;
6.mkdir(имя_нового_каталога) – создает новый каталог:
>>>os.chdir('TEMP')
>>>os.listdir()
['LAB', 'LAB.rar', 'python', 'Python_book', 'SAMPLES', 'TEMP', 'THEORY', 'ТЕОРИЯ'];
7.rmdir(путь) – удаляет указанный каталог:
>>>os.chdir('TEMP')
>>>os.listdir()
['LAB', 'LAB.rar', 'python', 'Python_book', 'SAMPLES', 'THEORY', 'ТЕОРИЯ'];
Установка пакетов в Python
Установить пакет в Python можно с помощью pip. Для этого в командной строке операционной системы необходимо выполнить команду:
pip install имя_пакета
При установке в Windows, перед pip нужно добавить «python -m». Обновление пакета осуществляется с помощью следующей команды:
pip install имя_пакета -U
Для обновления пакета до последней версии используется команда:
pip install --upgrade имя_пакета
Если установлена последняя версия пакета, но необходимо принудительно переустановить его, то следует воспользоваться следующей командой:
pip install --force-reinstall имя_пакета
Удаление ненужного пакета осуществляется командой
pip uninstall имя_пакета
Посмотреть список установленных пакетов Python можно с помощью команды
«pip list».
Найти конкретный пакет по имени можно командой «pip search».
О других командах можно прочесть в справке, которая выдается по команде «pip
help».
Задание 1
Вычисление по формуле должно быть реализовано в отдельной функции. Если модуль является главным, то получить значение N, осуществить вызов функции и вывести на экран N и результат вычисления.
Вариант 1
Задание: Вычислить сумму синусов натуральных чисел от 1 до N.
Формула: S = sin(1) + sin(2) + sin(3) + ... + sin(N)
Условия:
•N - случайное целое число от 5 до 15 (использовать random)
•Для вычисления синуса использовать функцию sin() из модуля math
•Вычисление выполнить с помощью цикла for
Вариант 2
Задание: Вычислить сумму косинусов от π, деленного на натуральные числа.
Формула: S = cos(π/1) + cos(π/2) + cos(π/3) + ... + cos(π/N)
Условия:
•N - случайное целое число от 5 до 12 (использовать random)
•Для вычисления косинуса и π использовать модуль math
•Вычисление выполнить с помощью цикла for
Вариант 3
Задание: Вычислить сумму квадратных корней натуральных чисел.
Формула: S = √1 + √2 + √3 + ... + √N
Условия:
•N - случайное целое число от 5 до 15 (использовать random)
•Для вычисления квадратного корня использовать функцию sqrt() из модуля math
•Вычисление выполнить с помощью цикла for
Вариант 4
Задание: Вычислить сумму натуральных логарифмов чисел.
Формула: S = ln(1) + ln(2) + ln(3) + ... + ln(N)
Условия:
•N - случайное целое число от 5 до 15 (использовать random)
•Для вычисления натурального логарифма использовать функцию log() из модуля math
•Вычисление выполнить с помощью цикла for
Вариант 5
Задание: Вычислить сумму экспонент натуральных чисел.
Формула: S = e¹ + e² + e³ + ... + eᴺ
Условия:
•N - случайное целое число от 3 до 8 (использовать random)
•Для вычисления экспоненты использовать функцию exp() из модуля math
•Вычисление выполнить с помощью цикла for
Вариант 6
Задание: Вычислить сумму тангенсов натуральных чисел.
Формула: S = tan(1) + tan(2) + tan(3) + ... + tan(N)
Условия:
•N - случайное целое число от 5 до 12 (использовать random)
•Для вычисления тангенса использовать функцию tan() из модуля math
•Вычисление выполнить с помощью цикла while
Вариант 7
Задание: Вычислить сумму арктангенсов натуральных чисел.
Формула: S = arctan(1) + arctan(2) + arctan(3) + ... + arctan(N)
Условия:
•N - случайное целое число от 5 до 12 (использовать random)
•Для вычисления арктангенса использовать функцию atan() из модуля math
•Вычисление выполнить с помощью цикла for
Вариант 8
Задание: Вычислить сумму гиперболических синусов натуральных чисел.
Формула: S = sinh(1) + sinh(2) + sinh(3) + ... + sinh(N)
Условия:
•N - случайное целое число от 3 до 8 (использовать random)
•Для вычисления гиперболического синуса использовать функцию sinh() из модуля math
•Вычисление выполнить с помощью цикла for
Вариант 9
Задание: Вычислить сумму десятичных логарифмов натуральных чисел.
Формула: S = log (1) + log (2) + log (3) + ... + log (N)
Условия:
•N - случайное целое число от 5 до 15 (использовать random)
•Для вычисления десятичного логарифма использовать функцию log10() из модуля math
•Вычисление выполнить с помощью цикла for
Вариант 10
Задание: Вычислить сумму чисел, возведенных в степень π.
Формула: S = 1^π + 2^π + 3^π + ... + N^π
Условия:
•N - случайное целое число от 3 до 8 (использовать random)
•Для возведения в степень использовать функцию pow() из модуля math
•Для получения π использовать константу pi из модуля math
•Вычисление выполнить с помощью цикла for
Вариант 11
Задание: Вычислить сумму углов в градусах, преобразованных в радианы.
Формула: S = radians(1) + radians(2) + radians(3) + ... + radians(N)
Условия:
•N - случайное целое число от 5 до 15 (использовать random)
•Для преобразования градусов в радианы использовать функцию radians() из модуля math
•Вычисление выполнить с помощью цикла for
Вариант 12
Задание: Вычислить сумму расстояний от начала координат до точек (i, i²).
Формула: S = √(1²+1 ) + √(2²+2 ) + √(3²+3 ) + ... + √(N²+N )
Условия:
•N - случайное целое число от 5 до 12 (использовать random)
•Для вычисления корня использовать функцию sqrt() из модуля math
•Для возведения в степень использовать функцию pow() из модуля math
•Вычисление выполнить с помощью цикла for
Вариант 13
Задание: Вычислить сумму гипотенуз прямоугольных треугольников с катетами
iи i+1.
Формула: S = √(1²+2²) + √(2²+3²) + √(3²+4²) + ... + √(N²+(N+1)²)
Условия:
•N - случайное целое число от 5 до 12 (использовать random)
•Для вычисления корня использовать функцию sqrt() из модуля math
•Для возведения в степень использовать функцию pow() из модуля math
•Вычисление выполнить с помощью цикла for
Вариант 14
Задание: Вычислить сумму площадей кругов с радиусами от 1 до N.
Формула: S = π×1² + π×2² + π×3² + ... + π×N²
Условия:
•N - случайное целое число от 5 до 10 (использовать random)
•Для получения π использовать константу pi из модуля math
•Для возведения в степень использовать функцию pow() из модуля math
•Вычисление выполнить с помощью цикла for
Вариант 15
Задание: Вычислить сумму объемов сфер с радиусами от 1 до N.
Формула: S = (4/3)×π×1³ + (4/3)×π×2³ + (4/3)×π×3³ + ... + (4/3)×π×N³
Условия:
•N - случайное целое число от 3 до 8 (использовать random)
•Для получения π использовать константу pi из модуля math
•Для возведения в степень использовать функцию pow() из модуля math
•Вычисление выполнить с помощью цикла for
Вариант 16
Задание: Вычислить сумму длин окружностей с диаметрами от 1 до N.
Формула: S = π×1 + π×2 + π×3 + ... + π×N
Условия:
•N - случайное целое число от 5 до 15 (использовать random)
•Для получения π использовать константу pi из модуля math
•Вычисление выполнить с помощью цикла for
Вариант 17
Задание: Вычислить сумму евклидовых расстояний между последовательными точками.
Формула: S = √((2-1)²+(2²-1²)²) + √((3-2)²+(3²-2²)²) + ... + √((N-(N-1))²+(N²-(N-1)²)²)
