Текстові файли. Приклади розв’язку задач на модифікацію текстових файлів
У даній темі наведено приклади рішення найбільш поширених задач, що виникають при обробці текстових файлів. Запропонований підхід оперування даними у файлах може бути використаний для рішення широкого кола споріднених задач.
Зміст
- 1. Як визначити, що дані у текстовому файлі закінчились?
- 2. Як прочитати рядки з текстового файлу, якщо їх кількість невідома? Способи визначення кількості рядків у файлі
- 3. Заміна рядка у текстовому файлі. Приклад
- 4. Видалення рядка з файлу за його індексом. Приклад
- 5. Вставка рядка в задану позицію файлу. Приклад
- 6. Обмін місцями двох рядків у файлі. Приклад
- 7. Реверсування рядків файлу (перестановка рядків файлу у зворотному порядку). Приклад
- 8. Сортування рядків файлу. Метод сортування вибором. Приклад
- 9. Об’єднання двох файлів. Приклад
- Зв’язані теми
Пошук на інших ресурсах:
1. Як визначити, що дані у текстовому файлі закінчились?
У мові Python для читання рядка використовується метод readline(). Якщо цей метод повертає пустий рядок ”, то це є ознакою кінця файлу.
Приклад.
# Обчислити кількість рядків у файлі # 1. Відкрити текстовий файл для читання f = open('TextFile1.txt', 'r') # 2. Цикл читання рядків файлу count = 0 # к-сть рядків у файлі s = f.readline() while s != '': # цикл читання рядків до пустого рядка s = f.readline() count = count+1 print('count = ', count) # вивести результат # 3. Закрити файл f.close()
⇑
2. Як прочитати рядки з текстового файлу, якщо їх кількість невідома? Способи визначення кількості рядків у файлі
Для читання усіх рядків файлу можна виділити два основні способи:
- прочитати рядки файлу методом readlines(). Результатом буде список. Потім з допомогою методу len() визначити кількість рядків;
- реалізувати цикл читання рядків методом readline() до тих пір, поки не буде пустий рядок. Метод readline() повертає пустий рядок у випадку, коли досягнуто кінець файлу.
Приклад. У прикладі наводиться 3 способи визначення кількості рядків у файлі.
# Визначення кількості рядків у файлі # Спосіб 1. Метод readline(). # 1.1. Відкрити текстовий файл для читання f = open('TextFile1.txt', 'r') # 1.2. Цикл читання рядків файлу count = 0 # к-сть рядків у файлі s = f.readline() while s != '': # цикл читання рядків до пустого рядка s = f.readline() count = count+1 print('count = ', count) # вивести результат # 1.3. Закрити файл f.close() # ---------------------------------- # Спосіб 2. Метод readlines() # 2.1. Відкрити текстовий файл для читання f = open('TextFile1.txt', 'r') # 2.2. Прочитати рядки файлу в список L L = f.readlines() # 2.3. К-сть елементів списку == к-сть рядків у файлі count = len(L) print('count = ', count) # 2.4. Закрити файл f.close() # ------------------------------------- # Спосіб 3. Використання ітератору файлу # 3.1. Відкрити текстовий файл для читання f = open('TextFile1.txt', 'r') # 3.2. Використати файловий ітератор count = 0 for line in f: count = count+1 # 3.3. Вивести результат print('count = ', count) # 3.4. Закрити файл f.close()
⇑
3. Заміна рядка у текстовому файлі. Приклад
Щоб замінити рядок у текстовому файлі потрібно виконати такі дії:
- зчитати файл у список;
- змінити рядок у списку;
- записати список у файл.
# Заміна рядка у текстовому файлі # 1. Заданий рядок s = "Hello world!" # 2. Задана позиція (нумерується від 0) pos = 3 # 3. Відкрити файл для читання f = open('TextFile1.txt', 'r') # 4. Зчитати усі рядки з файлу у список L L = f.readlines() # 5. Замінити рядок у списку в позиції pos if (pos >= 0) and (pos < len(L)): # в останньому рядку '\n' не додавати if (pos==len(L)-1): L[pos] = s else: L[pos] = s + '\n' # 6. Закрити файл f.close() # ------------------------------------ # Записати змінений список у файл # 7. Відкрити файл для запису f = open('TextFile1.txt', 'w') # 8. Записати список for line in L: f.write(line) # 9. Закрити файл f.close()
⇑
4. Видалення рядка з файлу за його індексом. Приклад
За прикладом п. 3 виконується видалення рядка за його індексом.
# Видалення рядка з файлу за його індексом # 1. Ввести позицію видалення (нумерується від 0) pos = int(input('pos = ')) # 2. Відкрити файл для читання f = open('TextFile1.txt', 'r') # 3. Зчитати усі рядки з файлу у список L L = f.readlines() # 4. Видалити рядок зі списку # Перевірка, чи коректна позиція pos if (pos >= 0) and (pos < len(L)): i = pos while i<len(L)-1: L[i] = L[i+1] i = i+1 L = L[:-1] # забрати останній елемент у списку # 5. Закрити файл f.close() # ------------------------------------ # Записати змінений список у файл # 6. Відкрити файл для запису f = open('TextFile1.txt', 'w') # 7. Записати список for line in L: f.write(line) # 8. Закрити файл f.close()
⇑
5. Вставка рядка в задану позицію файлу. Приклад
У даному прикладі здійснюється вставка рядка в задану позицію файла. Якщо вказати позицію, яка розміщена за останнім рядком файлу, то здійснюється дописування рядка в кінець файлу.
# Вставка рядка в задану позицію файлу # 1. Ввести рядок s = str(input('s = ')) # 2. Ввести позицію вставки (нумерується від 0). # Якщо позиція рівна кількості рядків у файлі, # то відбувається дописування рядка в кінець файлу. pos = int(input('pos = ')) # 3. Відкрити текстовий файл для читання f = open('TextFile1.txt', 'r') # 4. Зчитати усі рядки з файлу у список L L = f.readlines() # 5. Перевірка, чи коректне значення pos if (pos<0) or (pos>len(L)): f.close() exit() # 6. Перевірка, чи pos - рядок, що має слідувати # за останнім рядком if pos==len(L): # потрібно додати рядок в кінець списку L L[len(L)-1] += '\n' L2 = L + [s] # додати до кінця списку L рядок s else: # Створити новий список L2, який буде містити # список L з новим рядком s, вставленим у позиції pos. L2 = [] # Скопіювати елементи з L в L2 до позиції вставки L2 = L2 + L[:pos] # використати зріз # У список L2 вставити елемент s + новий рядок L2 = L2 + [s + '\n'] # Скопіювати з L в L2 елементи, що лежать після pos L2 = L2 + L[pos:] # знову використати зріз # 7. Закрити файл f.close() # ------------------------------------ # Записати новостворений список L2 у файл # 8. Відкрити файл для запису f = open('TextFile1.txt', 'w') # 9. Записати список L2 for line in L2: f.write(line) # 10. Закрити файл f.close()
⇑
6. Обмін місцями двох рядків у файлі. Приклад
При читанні списку з файлу, останній рядок списку може бути з символом ‘\n’ в кінці або без нього. Цю особливість потрібно враховувати у програмі.
# Обмін двох рядків у файлі місцями # 1. Ввести позицію рядка 1 (нумерується з 0) pos1 = int(input('pos1 = ')) # 2. Ввести позицію рядка 2 (нумерується з 0), pos2>pos1 pos2 = int(input('pos2 = ')) # 3. Перевірка, чи pos2>pos1 if pos2<=pos1: exit() # 4. Відкрити текстовий файл для читання f = open('TextFile1.txt', 'r') # 5. Зчитати усі рядки з файлу у список L L = f.readlines() # 6. Корегування останнього рядка - додати '\n', якщо потрібно s = L[len(L)-1] # взяти останній рядок length = len(s) # взяти довжину останнього рядка f_nl = True # прапорець, що вказує, чи був символ '\n' в кінці файлу if (length>0) and ((s[length-1] != '\n')): L[len(L)-1] += '\n' # додати в останній рядок '\n' f_nl = False # 7. Закрити файл f.close() # 8. Перевірка, чи коректно задані позиції pos1 та pos2 if (pos1<0)or(pos1>=len(L))or(pos2<0)or(pos2>=len(L)): exit() # 9. Обмін рядків місцями s = L[pos1] L[pos1] = L[pos2] L[pos2] = s # ------------------------------------ # Записати новостворений список L у файл # 10. Відкрити файл для запису f = open('TextFile1.txt', 'w') # 11. Якщо в кінці файлу не було '\n' if f_nl == False: # то забрати з останнього рядка '\n' L[len(L)-1] = L[len(L)-1][:-1] # 12. Цикл запису кожного рядка списку у файл for item in L: f.write(item) # 13. Закрити файл f.close()
⇑
7. Реверсування рядків файлу (перестановка рядків файлу у зворотному порядку). Приклад
# Перестановка рядків файлу у зворотному порядку # 1. Відкрити текстовий файл для читання f = open('TextFile1.txt', 'r') # 2. Зчитати усі рядки з файлу у список L L = f.readlines() # 3. Корегування останнього рядка - додати '\n', якщо потрібно s = L[len(L)-1] # взяти останній рядок length = len(s) # взяти довжину останнього рядка f_nl = True # прапорець, що вказує, чи був символ '\n' в кінці файлу if (length>0)and((s[length-1] != '\n')): L[len(L)-1] += '\n' # додати в останній рядок '\n' f_nl = False # 4. Закрити файл f.close() # 5. Утворити новий список L2 - реверсний до списку L L2=[] i=0 while i<len(L): s = L[len(L)-i-1] # взяти рядок з кінця списку L L2 = L2 + [s] i = i+1 # 6. Якщо в кінці файлу не було '\n' if f_nl == False: # то забрати з останнього рядка '\n' L2[len(L)-1] = L2[len(L)-1][:-1] # ------------------------------------ # Записати новостворений список L2 у файл # 7. Відкрити файл для запису f = open('TextFile1.txt', 'w') # 8. Цикл запису кожного рядка списку у файл for item in L2: f.write(item) # 9. Закрити файл f.close()
⇑
8. Сортування рядків файлу. Метод сортування вибором. Приклад
Наводиться приклад сортування рядків файлу. Використовується метод сортування вибором.
# Сортування рядків файлу. Метод сортування вибором # 1. Відкрити текстовий файл для читання f = open('TextFile1.txt', 'r') # 2. Зчитати усі рядки з файлу у список L L = f.readlines() # 3. Корегування останнього рядка - додати '\n', якщо потрібно s = L[len(L)-1] # взяти останній рядок length = len(s) # взяти довжину останнього рядка f_nl = True # прапорець, що вказує, чи був символ '\n' в кінці файлу if (length>0)and((s[length-1] != '\n')): L[len(L)-1] += '\n' # додати в останній рядок '\n' f_nl = False # 4. Закрити файл f.close() # 5. Сортування вибором списку L i=0 while i<len(L): k = i # пошук найменшого елементу x = L[i] j=i+1 while j<len(L): if L[j]<x: k = j x = L[j] j=j+1 # Обміняти місцями найменший елемент з L[i] L[k] = L[i] L[i] = x i=i+1 # 6. Врахувати, чи був у кінці символ '\n' if f_nl == False: # то забрати з останнього рядка '\n' L[len(L)-1] = L[len(L)-1][:-1] # ------------------------------------ # Записати новостворений список L у файл # 7. Відкрити файл для запису f = open('TextFile1.txt', 'w') # 8. Цикл запису кожного рядка списку у файл for item in L: f.write(item) # 9. Закрити файл f.close()
⇑
9. Об’єднання двох файлів. Приклад
# ----------------------- # Об'єднання файлів myfile1.bin+myfile2.bin => myfile3.bin # 1. Відкрити файли для читання f1 = open('myfile1.bin', 'rb') f2 = open('myfile2.bin', 'rb') # 2. Зчитати файли у списки L1, L2 L1 = f1.readlines() L2 = f2.readlines() # 3. Об'єднати списки L3 = L1 + L2 # 4. Закрити файли myfile1.bin, myfile2.bin f1.close() f2.close() # 5. Відкрити файл myfile3.bin для запису f3 = open('myfile3.bin', 'wb') # 6. Записати рядки в файл f3.writelines(L3) # 7. Закрити результуючий файл f3.close()
⇑
Зв’язані теми
- Загальні поняття. Відкриття/закриття файлу. Функції open(), close()
- Приклади роботи з текстовими файлами
- Приклади роботи з бінарними файлами
- Модуль struct. Робота з бінарними файлами. Приклади збереження/читання упакованих двійкових даних
- Модуль pickle. Серіалізація об’єктів. Приклади використання для запису/читання інформації з бінарних файлів
⇑