Текстові файли Python

Запис у текстовий файл

Щоб відкрити текстовий файл на запис, необхідно застосувати режим w (перезапис) або a (дозапис). Потім для запису застосовується метод write(str), в який передається записуваний рядок. Варто відзначити, що записується саме рядок, тому, якщо потрібно записати числа чи дані інших типів, то їх слід попередньо конвертувати в рядок.

Запишемо деяку інформацію в файл "hello.txt":

with open("hello.txt", "w") as file:  
    file.write("hello world") 

Якщо ми відкриємо папку, в якій знаходиться поточний скрипт Python, то побачимо там файл hello.txt. Цей файл можна відкрити в будь-якому текстовому редакторі і при бажанні змінити.

Тепер дозапишем в цей файл ще один рядок:

with open("hello.txt", "a") as file:  
    file.write("\ngood bye, world")  

Дозапис виглядає як додавання рядка до останнього символу в файлі, тому, якщо необхідно зробити запис з нового рядка, то можна використовувати ескейп-послідовність "\n". У підсумку файл hello.txt матиме такий вміст:

hello world  
good bye, world  

Ще один спосіб запису в файл представляє стандартний метод print(), який застосовується для виведення даних на консоль:

with open("hello.txt", "a") as hello_file:  
    print("Hello, world", file=hello_file)  

Для виведення даних у файл в метод print в якості другого параметра передається назва файлу через параметр file. А перший параметр представляє записувану в файл рядок.

Читання файлу

Для читання файлу він відкривається з режимом r (Read), і потім ми можемо прочитати його вміст різними методами:

  • readline(): читає один рядок з файлу
  • read(): зчитує весь вміст файлу в один рядок
  • readlines(): зчитує всі рядки файлу в список

Наприклад, вважаємо вище записаний файл порядково:

with open("hello.txt", "r") as file:  
    for line in file:  
        print(line, end="")

Незважаючи на те, що ми явно не застосовуємо метод readline() для читання кожного рядка, але при переборі файлу цей метод автоматично викликається для отримання кожного нового рядка. Тому в циклі вручну немає сенсу викликати метод readline. І оскільки рядки поділяються символом переводу рядка "\n", то щоб виключити зайве перенесення на інший рядок у функцію print передається значення end="".

Тепер явним чином викличемо метод readline() для читання окремих рядків:

with open("hello.txt", "r") as file:  
    str1 = file.readline()  
    print(str1, end="")  
    str2 = file.readline()  
    print(str2)  

Консольний висновок:

hello world
good bye, world

Метод readline можна використовувати для построчного зчитування файлу в циклі while:

with open("hello.txt", "r") as file:  
    line = file.readline()  
    while line:  
        print(line, end="")  
        line = file.readline()  

Якщо файл невеликий, то його можна весь прочитати за допомогою методу read():

with open("hello.txt", "r") as file:  
    content = file.read()  
    print(content) 

І також застосуємо метод readlines() для зчитування всього файлу в список рядків:

with open("hello.txt", "r") as file:  
    contents = file.readlines()  
    str1 = contents[0]  
    str2 = contents[1]  
    print(str1, end="")  
    print(str2) 

При читанні файлу ми можемо зіткнутися з тим, що його кодування не збігається з ASCII. У цьому випадку ми явно можемо вказати кодування за допомогою параметра encoding:

filename = "hello.txt"  
with open(filename, encoding="utf8") as file:  
    text = file.read() 

Тепер напишемо невеликий скрипт, який буде записувати введений масив рядків і зчитувати його з файлу на консоль:

# ім'я файлу  
FILENAME = " messages.txt"  
# визначаємо порожній список  
messages = list()     

for i in range(4):  
    message = input("Введіть рядок" + str(i+1) + ": ")  
    messages.append(message + "\n")     

# запис списку в файл  
with open(FILENAME, "a") as file:  
    for message in messages:  
        file.write(message)     

# зчитуємо повідомлення з файлу  
print("Лічені повідомлення")  
with open(FILENAME, "r") as file:  
    for message in file:  
        print(message, end="")

Приклад роботи програми:

Введіть рядок 1: hello
Введіть рядок 2: world peace
Введіть рядок 3: great job
Введіть рядок 4: Python
Лічені повідомлення
hello
world peace
great job
Python