Python. Текстові файли. Приклади обробки (модифікації) текстових файлів згідно з умовою

Текстові файли. Приклади розв’язку задач на модифікацію текстових файлів

У даній темі наведено приклади рішення найбільш поширених задач, що виникають при обробці текстових файлів. Запропонований підхід оперування даними у файлах може бути використаний для рішення широкого кола споріднених задач.


Зміст


Пошук на інших ресурсах:




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()

 


Зв’язані теми