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

 


Связанные темы