Робота з файлами

Файли
Великі обсяги даних має сенс зберігати не в списках або словниках, а в файлах. Тому в мовах програмування передбачена можливість роботи з файлами. В Python файли розглядаються як об'єкти файлових класів, тобто, наприклад, текстовий файл - це тип даних поряд з типами списку, словника, цілого числа і ін.

Зазвичай файли ділять на текстові і байтові (бінарні). Перші розглядаються як містять символьні дані, рядки. Другі - як потік байтів. Побайтово зчитуються, наприклад, файли зображень.

Робота з бінарними файлами трохи складніше. Нерідко їх обробляють за допомогою спеціальних модулів Python (pickle, struct). Розглянемо базові прийоми читання текстових файлів і записи в них.

Режими
r  -   тільки читання (значення за замовчуванням). Після відкриття файлу покажчик           встановлюється на початок файлу. Якщо файл не існує, то збуджується виключення IOError.

r+  -   читання і запис. Після відкриття файлу покажчик встановлюється на початок файлу. Якщо файл не існує, то збуджується виключення IOError.

w   -  запис. Якщо файл не існує, то він буде створений. Якщо файл існує, то він буде перезаписаний. Після відкриття файлу покажчик встановлюється на початок файлу.

w+  -   читання і запис. Якщо файл не існує, то він буде створений. Якщо файл існує, то він буде перезаписаний. Після відкриття файлу покажчик встановлюється на початок файлу.

a   -    запис. Якщо файл не існує, то він буде створений. Запис здійснюється у кінець файлу. Вміст файлу не видаляється.

a+  -   читання і запис. Якщо файл не існує, то він буде створений. Запис здійснюється у кінець файлу. Вміст файлу не видаляється.

Функція open () - відкриття файлу
Відкриття файлу виконується за допомогою вбудованої в Python функції open(). Зазвичай їй передають один або два аргументи.
Перший - ім'я файлу або ім'я з адресою, якщо файл знаходиться не в тому каталозі, де знаходиться скрипт.
Другий аргумент - режим, в якому відкривається файл.

Зазвичай використовуються режими читання ( 'r') і запису ( 'w').
Якщо файл відкритий в режимі читання, то запис в нього неможлива. Можна тільки зчитувати дані з нього.
Якщо файл відкритий в режимі запису, то в нього можна тільки записувати дані, зчитувати не можна.

Якщо файл відкривається в режимі 'w', то всі дані, які в ньому були до цього, стираються. Файл стає порожнім. Якщо не треба видаляти існуючі в файлі дані, тоді слід використовувати замість режиму запису, режим дозаписи ( 'a').

Якщо файл відсутній, то відкриття його в режимі 'w' створить новий файл. Бувають ситуації, коли треба гарантовано створити новий файл, уникнувши випадкової перезапису даних існуючого. У цьому випадку замість режиму 'w' використовується режим 'x'. У ньому завжди створюється новий файл для запису. Якщо вказано ім'я існуючого файлу, то буде викинуто виключення. Втрати даних у вже наявному файлі не відбудеться.

Якщо при виклику open () другий аргумент не вказано, то файл відкривається в режимі читання як текстовий файл. Щоб відкрити файл як байтовий, додатково до букви режиму читання / запису додається символ 'b'. Буква 't' позначає текстовий файл. Оскільки це тип файлу за замовчуванням, то зазвичай її не вказують.

Не можна вказувати тільки тип файлу, тобто open ( "ім'я файлу", 'b') є помилка, навіть якщо файл відкривається на читання. Правильно - open ( "ім'я файлу", "rb '). Тільки текстові файли ми можемо відкрити командою open ( "ім'я файлу"), тому що і 'r' і 't' маються на увазі за замовчуванням.

Функція open () повертає об'єкт файлового типу. Його треба або відразу зв'язати зі змінною, щоб не втратити, або відразу прочитати.

Читання файлу
За допомогою файлового методу read () можна прочитати файл цілком або тільки певну кількість байт. Нехай у нас є файл data.txt з таким вмістом:

one - 1 - I
two - 2 - II
three - 3 - III
four - 4 - IV
five - 5 - V

Відкриємо його і почитаємо:

>>> f1 = open('data.txt')
>>> f1.read(10)
'One - 1 -'
>>> f1.read ()
'I \ ntwo - 2 - II \ nthree - 3 - III \ nfour - 4 - IV \ nfive - 5 - V \ n'
>>> f1.read ()
''
>>> type(f1.read())
<Class 'str'>

Спочатку зчитуються перші десять байтів, які дорівнюють десяти символів. Це не бінарний файл, але ми все одно можемо читати по байтам. Подальший виклик read () зчитує весь текст. Після цього об'єкт файлового типу f1 стає порожнім.

Зауважимо, що метод read () повертає рядок, і що кінець рядка зчитується як '\ n'.

Для того, щоб читати файл через підрядник існує метод readline ():

>>> f1 = open('data.txt')
>>> f1.readline()
'One - 1 - I \ n'
>>> f1.readline ()
'Two - 2 - II \ n'
>>> f1.readline ()
'Three - 3 - III \ n'

Метод readlines () зчитує відразу всі рядки і створює список:

>>> f1 = open('data.txt')
>>> f1.readlines ()
['One - 1 - I \ n', 'two - 2 - II \ n', 'three - 3 - III \ n', 'four - 4 - IV \ n', 'five - 5 - V \ n' ]

Об'єкт файлового типу відноситься до ітератор. З таких об'єктів відбувається послідовний витяг елементів. Тому зчитувати дані з них можна відразу в циклі без використання методів читання:

>>> for i in open('data.txt'):
... print(i)
...
one - 1 - I

two - 2 - II

three - 3 - III

four - 4 - IV

five - 5 - V

>>>

Тут при виведенні спостерігаються зайві порожні рядки. Функція print () перетворює '\ n' в перехід на новий рядок. До цього додає свій перехід на новий рядок. Створимо список рядків файлу без '\ n':

>>> nums = []
>>> for i in open('data.txt'):
... nums.append(i[: -1])
...
>>> nums
['One - 1 - I', 'two - 2 - II', 'three - 3 - III', 'four - 4 - IV', 'five - 5 - V']

Змінної i присвоюється черговий рядок файлу. Ми беремо її зріз від початку до останнього символу, не включаючи його. Слід мати на увазі, що '\ n' це один символ, а не два.

Запис в файл
Запис в файл виконується за допомогою методів write () і writelines (). У другій можна передати структуру даних:

>>> l = ['tree', 'four']
>>> f2 = open('newdata.txt', 'w')
>>> f2.write('one')
3
>>> f2.write('two')
4
>>> f2.writelines(l)

Метод write () повертає кількість записаних символів.

Закриття файлу
Після того як робота з файлом закінчена, важливо не забувати його закрити, щоб звільнити місце в пам'яті. Робиться це за допомогою файлового методу close (). Властивість файлового об'єкта closed дозволяє перевірити чи закритий файл.

>>> f1.close()
>>> f1.closed
True
>>> f2.closed
False

Якщо файл відкривається в заголовку циклу (for i in open ( 'fname')), то мабуть інтерпретатор його закриває при завершенні роботи циклу або через якийсь час.

# Приклад 1
# Наступна програма зчитує весь вміст файлу input.txt, записує його в змінну s, а потім #виводить її в файл output.txt.
# Нехай в файл input.txt записано We are learning Python programming language

f1 = open('input.txt', 'r')
f2 = open('output.txt', 'w')
s = f1.read()
print(s)         # вивід на екран значення змінної s
f2.write(s)
f1.close()
f2.close()

А ось аналогічна програма, але читаюча дані посимвольно:

f1 = open('input.txt', 'r')
f2 = open('output.txt', 'w')
c = f1.read(1)
while len(c)> 0:
     f2.write(c)
     c = f1.read(1)
     print(c)
f1.close()
f2.close()

# Приклад 2
""" Створіть файл nums.txt, що містить кілька чисел, записаних через пропуск.Напишіть програму, яка підраховує і виводить на екран загальну суму чисел, що зберігаються в цьому файлі. """

def num_input():
    import random
    from random import randint, randrange
    f=open('nums.txt','w')
    for i in range(7):
        i=str(randint(0,10))+' '
        f.write(i)    
    f.close()
#----------------------------------
num_input()
z=[]
with open('nums.txt') as f:
    f=f.read().split()
    for i in f:
        i=int(i)
        z.append(i)

print('Числа в файлі:{}'.format(z),'\nSum is: {}'.format(sum(z)))

Скриншот результату роботи програми:






Запитання
1. Які основні етапи роботи з файлами в програмі?
2. Які можливі режими відкриття файлу?
3. Як здійснюється зчитування всього файлу у мові Python?
4. Як здійснюється у мові Python запис даних у порожній файл?
5. Яким чином можна додати нові дані до файлу?
6. Як можна рядки файлу записати до списку?







Комментариев нет:

Отправить комментарий