Similar presentations:
Робота з файлами Ч.2
1.
Робота з файлами Ч.22. Файли 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)
3. Файли CSV
У файл записується двомірний список - фактично таблиця, де кожен рядок представляєодного користувача. А кожен користувач містить два поля - ім'я та вік. Тобто фактично
таблиця з трьох рядків та двох стовпців.
Для запису нам треба отримати об'єкт writer , який повертається функцією csv.writer(file). У
цю функцію передається відкритий файл. А запис здійснюється за допомогою методу
writer.writerows(users). Цей метод приймає набір рядків. У нашому випадку це двовимірний
список.
Якщо необхідно додати один запис, який являє собою одномірний список, наприклад,
["Sam", 31] то в цьому випадку можна викликати метод writer.writerow(user)
У результаті після виконання скрипта в тій же папці з’явиться файл users.csv, який матиме
такий вміст:
Tom,28
Alice,23
Bob,34
Sam,31
4. Файли CSV
Для читання з файлу нам навпаки потрібно створити об'єкт reader :import csv
FILENAME = "users.csv"
with open(FILENAME, "r") as file:
reader = csv.reader(file)
for row in reader:
print(row[0], " - ", row[1])
При отриманні об'єкта reader ми можемо у циклі перебрати всі його рядки:
Tom - 28
Alice - 23
Bob - 34
Sam - 31
5. Робота зі словниками
У прикладі вище кожен запис або рядок являв собою окремий список,наприклад, ["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") as file:
reader = csv.DictReader(file)
for row in reader:
print(row["name"], "-", row["age"])
6. Робота зі словниками
Запис рядків також здійснюється за допомогою методів writerow()та writerows().Але тепер кожен рядок є окремим словником, і крім того, проводиться запис і
заголовків стовпців за допомогою методу writeheader() , а метод csv.DictWriter
як другий параметр передається набір стовпців.
Під час читання рядків, використовуючи назви стовпців, ми можемо звернутися до
окремих значень усередині рядка: row["name"].
7. Бінарні файли
Бінарні файли, на відміну від текстових, зберігають інформацію у вигляді набору байт.При відкритті бінарного файлу для читання або запису також слід враховувати, що нам
потрібно застосовувати режим "b" на додаток до режиму запису ("w") або читання
("r").
Під час читання ми отримуємо файл як набору байт, і навпаки, під час запису в метод
write()передається набір байт. Наприклад, скопіюємо файл:
FILENAME = "forest.png"
NEWFILENAME = "forest_new.png"
image_data = []
with open(FILENAME, "rb") as file:
image_data = file.read()
with open(NEWFILENAME, "wb") as file:
file.write(image_data)
print(f"File {FILENAME} is copy in {NEWFILENAME}")
8. Бінарні файли
Модуль pickleТакож для роботи з бінарними файлами 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:", name, "\tAge:", age)
Результат:
9. Бінарні файли
Подібним чином ми можемо зберігати та витягувати з файлу набори об'єктів:import pickle
FILENAME = "users.dat"
users = [
["Tom", 28],
["Alice", 23],
["Bob", 34]
]
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("Name:", user[0], "\tAge:", user[1])
Результат:
10. Бінарні файли
Для роботи з бінарними файлами Python може застосовуватися ще один модуль shelve . Він зберігає об'єкти у файл із певним ключем. Потім за цим ключем можевитягти збережений об'єкт з файлу. Процес роботи з даними через модуль shelve
нагадує роботу зі словниками, які також використовують ключі для збереження та
вилучення об'єктів.
Для відкриття файлу модуль shelve використовує функцію open() :
import shelve
FILENAME = "states2"
with shelve.open(FILENAME) as states:
states["London"] = "Great Britain"
states["Paris"] = "France"
states["Berlin"] = "Germany"
states["Madrid"] = "Spain"
with shelve.open(FILENAME) as states:
print(states["London"])
print(states["Madrid"])
Результат:
11. Бінарні файли
Читання данихПри читанні даних, якщо запитуваний ключ відсутній, то генерується виняток. У цьому
випадку перед отриманням ми можемо перевіряти наявність ключа за допомогою
оператора in :
with shelve.open(FILENAME) as states:
key = "Brussels"
if key in states:
print(states[key])
Також ми можемо використати метод get() . Перший параметр методу - ключ,
якиму слід отримати значення, а другий - значення за замовчанням, яке
повертається, якщо ключ не знайдено.
with shelve.open(FILENAME) as states:
state = states.get("Brussels", "Undefined")
print(state)
Використовуючи цикл for, можна перебрати всі значення файлу:
with shelve.open(FILENAME) as states:
for key in states:
print(key," - ", states[key])
12. Бінарні файли
Метод keys() повертає всі ключі з файлу, а метод values() - всі значення:with shelve.open(FILENAME) as states:
for city in states.keys():
print(city, end=" ")
# London Paris Berlin Madrid
print()
for country in states.values():
print(country, end=" ")
# Great Britain France Germany
Spain
Ще один метод items() повертає набір кортежів. Кожен кортеж містить ключ та
значення.
with shelve.open(FILENAME) as states:
for state in states.items():
print(state)
13. Бінарні файли
Оновлення данихДля зміни даних достатньо присвоїти по ключу нове значення, а для додавання даних
визначити новий ключ:
import shelve
FILENAME = "states2"
with shelve.open(FILENAME) as states:
states["London"] = "Great Britain"
states["Paris"] = "France"
states["Berlin"] = "Germany"
states["Madrid"] = "Spain"
with shelve.open(FILENAME) as states:
states["London"] = "United Kingdom"
states["Brussels"] = "Belgium"
for key in states:
print(key, " - ", states[key])
14. Бінарні файли
Видалення данихДля видалення з одночасним отриманням можна використовувати функцію pop() , до
якої передається ключ елемента та значення за замовчанням, якщо ключ не знайдено:
import shelve
FILENAME = "states2"
with shelve.open(FILENAME) as states:
state = states.pop("London",
"NotFound")
Kingdom
Такожprint(state)
для видалення #United
може застосовуватись
оператор del :
import shelve
FILENAME = "states2"
with shelve.open(FILENAME) as states:
del states["Madrid"]
Для видалення всіх елементів можна використовувати метод clear() :
import shelve
FILENAME = "states2"
with shelve.open(FILENAME) as states:
states.clear()
15. Модуль OS та робота з файловою системою
Ряд можливостей роботи з каталогами і файлами надає вбудований модуль os . Хоча вінмістить багато функцій, розглянемо лише основні з них:
• mkdir() : створює нову папку
• rmdir() : видаляє папку
• rename() : перейменовує файл
• remove() : видаляє файл
Створення та видалення папки
Для створення папки застосовується функція mkdir() , в яку передається шлях
до створюваної папки:
import os
os.mkdir("hello")
os.mkdir("c://somedir")
os.mkdir("c://somedir/hello")
Для видалення папки використовується функція rmdir() , в яку передається шлях
до папки, що видаляється:
import os
os.rmdir("hello")
os.rmdir("c://somedir/hello")
16. Модуль OS та робота з файловою системою
Перейменування файлуДля перейменування викликається функція rename(source, target) , перший параметр якої шлях до вихідного
файлу, а другий - нове ім'я файлу. Як шляхи можуть використовуватися як абсолютні, так і відносні. Наприклад,
нехай у папці C://SomeDir/ міститься файл somefile.txt . Перейменуємо його на файл "hello.txt":
import os
os.rename("C://SomeDir/somefile.txt", "C://SomeDir/hello.txt")
Видалення файлу
Для видалення викликається функція remove() , до якої передається шлях до файлу:
import os
os.remove("C://SomeDir/hello.txt")
Існування файлу
Якщо ми спробуємо відкрити файл, який не існує, Python викине виняток FileNotFoundError. Але можна
вже до відкриття файлу перевірити, чи він існує чи ні за допомогою методу os.path.exists(path) . У цей
метод передається шлях, який необхідно перевірити:
import os
filename = input("Vvedit shlah do faily: ")
if os.path.exists(filename):
print("Fail isnue")
else:
print("Fail ne isnue")
17. Домашнє завдання
Напишіть інформаційну систему «Співробітники». Програма має забезпечувати введення, редагування тавидалення даних про співробітника, пошук співробітника за прізвищем, виведення інформації про співробітників
вказаного віку. Для цього реалізувати меню. Зробіть можливість зберігати знайдену інформацію у файл, як і весь
список співробітників (при виході з програми – автоматично, у процесі виконання програми – за командою
користувача). Під час старту програми відбувається завантаження списку співробітників із зазначеного
користувачем файлу.