Delete Lines From a File in Python
This article lets you know how to delete specific lines from a file in Python. For example, you want to delete lines #5 and #12.
After reading this article, you’ll learn:
- How to remove specific lines from a file by line numbers
- How to delete lines that match or contain the given text/string
- How to delete the first and last line from a text file.
Table of contents
Delete Lines from a File by Line Numbers
Please follow the below steps to delete specific lines from a text file by line number: –
-
in a read mode . Read all contents from a file into a list using a readlines() method. here each element of a list is a line from the file
- Close a file
- Again, open the same file in write mode.
- Iterate all lines from a list using a for loop and enumerate() function. The enumerate() function adds a counter to an iterable (such as list, string) and returns it in enumerate object. We used the enumerate object with a for loop to access the line number
- Use the if condition in each iteration of a loop to check the line number. If it matches the line number to delete, then don’t write that line into the file.
- Close a file
Example:
The following code shows how to delete lines from a text file by line number in Python. See the attached file used in the example and an image to show the file’s content for reference.
text file
In this example, we are deleting lines 5 and 8.
Our code deleted two lines. Here is a current data of a file
Note:
The enumerate() function adds a counter to an iterable (such as list, string) and returns it in enumerate object. We used the enumerate object with a for loop to access the line number. The enumerate() doesn’t load the entire list in memory, so this is an efficient solution.
Note: Don’t use del keywords to delete lines from a list and write the same list to file. Because when you delete a line from the list, the item’s index gets changed. So you will no longer be able to delete the correct line.
Using seek() method
The same can be accomplished using the seek() method by changing the pointer position so we don’t need to open a file twice.
- Open file in the read and write mode ( r+ )
- Read all lines from a file into the list
- Move the file pointer to the start of a file using seek() method
- Truncate the file using the truncate() method
- Iterate list using loop and enumerate() function
- In each iteration write the current line to file. Skip those line numbers which you want to remove
Example:
Delete First and Last Line of a File
To selectively delete certain content from the file, we need to copy the file’s contents except for those lines we want to remove and write the remaining lines again to the same file.
Use the below steps to delete the first line from a file.
- Open file in a read and write mode ( r+ )
- Read all lines from a file
- Move file pointer at the start of a file using the seek() method
- Truncate the file
- Write all lines from a file except the first line.
Output
Before deleting the first line
After deleting the first line
To delete the first N lines use list slicing.
If you are reading a file and don’t want to read the first line use the below approach instead of deleting a line from a file.
Use the below example to steps to delete the last line from a file
To delete last N lines use list slicing.
Deleting Lines Matching a text (string)
Assume files contain hundreds of line and you wanted to remove lines which match the given string/text. Let’s see how to remove lines that match the given text (exact match).
Steps:
- Read file into a list
- Open the same file in write mode
- Iterate a list and write each line into a file except those lines that match the given string.
Example 1: Delete lines that match the given text (exact match)
Also, you can achieve it using the single loop so it will be much faster.
Remove Lines that Contains a Specific Word
We may have to delete lines from a file that contains a particular keyword or tag in some cases. Let’s see the example to remove lines from file that contain a specific string anywhere in the line.
Example:
Remove Lines Starting with Specific Word/String
Learn how to remove lines from a file starting with a specific word. In the following example, we will delete lines that begin with the word ‘time‘.
Example:
Delete Specific Text from a Text File
It can also be the case that you wanted to delete a specific string from a file but not the line which contains it. Let’s see the example of the same
Delete all Lines From a File
To delete all the lines in a file and empty the file, we can use the truncate() method on the file object. The truncate() method removes all lines from a file and sets the file pointer to the beginning of the file.
Did you find this page helpful? Let others know about it. Sharing helps me continue to create free Python resources.
About Vishal
Founder of PYnative.com I am a Python developer and I love to write articles to help developers. Follow me on Twitter. All the best for your future Python endeavors!
Related Tutorial Topics:
Python Exercises and Quizzes
Free coding exercises and quizzes cover Python basics, data structure, data analytics, and more.
Python. Текстовые файлы. Примеры обработки (модификации) текстовых файлов в соответствии с условием
Текстовые файлы. Примеры решения задач на модификацию текстовых файлов
В данной теме приведены примеры решения задач, которые могут возникнуть при обработке текстовых файлов. Предложенный в данной теме подход оперирования данными в файлах может быть использован для решения широкого круга родственных задач.
Содержание
- 1. Как определить, что данные в текстовом файле закончились?
- 2. Как прочитать строки из текстового файла, если их количество неизвестно? Способы определения количества строк в файле
- 3. Замена строки в текстовом файле. Пример
- 4. Удаление строки из файла по ее индексу. Пример
- 5. Вставка строки в указанную позицию файла. Пример
- 6. Обмен местами двух строк в файле. Пример
- 7. Реверсирование строк файла (перестановка строк файла в обратном порядке). Пример
- 8. Сортировка строк файла. Метод сортировки выбором. Пример
- 9. Объединение двух файлов. Пример
Поиск на других ресурсах:
1. Как определить, что данные в текстовом файле закончились?
В языке Python для чтения строки используется метод readline() . Если этот метод возвращает пустую строку » , то это есть признаком конца файла.
Пример.
2. Как прочитать строки из текстового файла, если их количество неизвестно? Способы определения количества строк в файле
Для чтения всех строк файла можно выделить два основных способа:
- прочитать строки файла методом readlines() . Результатом будет список. Затем с помощью метода len() определить количество строк;
- реализовать цикл чтения строк методом readline() до тех пор, пока не будет пустая строка. Метод readline() возвращает пустую строку в случае, когда достигнут конец файла.
Пример. В примере приводятся 3 способа определения количества строк в файле.
3. Замена строки в текстовом файле. Пример
Чтобы заменить строку в текстовом файле нужно выполнить следующие действия:
- считать файл в список;
- изменить строку в списке;
- записать список в файл.
4. Удаление строки из файла по ее индексу. Пример
По примеру п. 3 выполняется удаление строки по ее индексу.
5. Вставка строки в указанную позицию файла. Пример
В данном примере осуществляется вставка строки в указанную позицию файла. Если указать позицию, которая размещена за последней строкой файла, то осуществляется дописывание строки в конец файла.
6. Обмен местами двух строк в файле. Пример
При чтении списка из файла, последняя строка списка может быть с символом ‘\n’ в конце или без него. Эту особенность нужно учитывать в программе.
7. Реверсирование строк файла (перестановка строк файла в обратном порядке). Пример
8. Сортировка строк файла. Метод сортировки выбором. Пример
Приводится пример сортировки строк файла. Используется метод сортировки выбором.
Работа с текстовыми файлами
Высокоуровневый язык программирования Python 3 предоставляет своим пользователям массу полезных средств для взаимодействия с текстовыми файлами. Встроенные методы платформы позволяют не только создавать документы для хранения строковой информации, но и читать из них данные, а также записывать, удалять и всячески манипулировать их содержимым.
Создание, открытие и закрытие файла
Работа с любым текстовым файлом в Python начинается с вызова специальной функции open, которая принимает в качестве параметров путь к объекту на компьютере и режим обработки. Путь к документу можно указать как абсолютный (адрес расположения на жестком диске ПК), так и как относительный (координаты относительно папки проекта). Выбирая нужный режим обработки файла, следует учитывать его назначение (“w” для записи, “r” для чтения данных). Следующий пример показывает простое взаимодействие с текстовым документом.
Как можно заметить, функция open принимает относительный путь файла и открывает его для записи. Если в папке с исходным кодом документа с аналогичным именем и расширением .txt не существует, метод open создает его самостоятельно, после чего открывает для него нужный режим обработки. Выполнив все необходимые действия с переменной file, которая ссылается на реальный файл, следует вручную закрыть его, чтобы избежать потери информации. Данную задачу выполняет метод close, если вызвать его при помощи оператора доступа (точки).
Выполнить точно такие же действия, но без необходимости вручную закрывать файл, вполне возможно благодаря связке операторов with as. Для этого необходимо поместить метод open сразу после ключевого слова with, а переменную, которая будет ссылаться на файл, прописать за конструкцией as. Ниже располагается пример открытия документа с помощью with as.
Оба примера небольших программ демонстрируют работу с test.txt, который генерируется в каталоге с исходным кодом. В качестве режима обработки для него выбирается запись данных. После этого при помощи метода write в него заносится строка “hello world”. Завершается код в обоих случаях закрытием текстового файла test.txt методом close или автоматически.
Запись построчно
Чтобы быстро записать информацию в текстовый файл, достаточно открыть его в программе, написанной на языке Python, после чего воспользоваться функцией write через переменную, которая ссылается на документ.
В Python запись в файл построчно осуществляется с помощью записи нужной строки с последующей записью символа перевода строки ‘\n’. Рассмотрим пример записи списка поэлементно. Каждый элемент будет записан в новой строке:
Приведенный выше пример небольшой программы показывает создание небольшого массива lines, который содержит три строковых элемента: “first”, “second” и “third”. За счет функции open и связки операторов with as происходит открытие текстового файла test.txt в корневом каталоге жесткого диска D. В цикле мы проходим по всем элементам списка и с помощью команды write их записываем. Чтобы каждая запись была с новой строки, добавляем символ перевода строки.
Так же можно воспользоваться функцией writelines. Если мы передадим в качестве ее параметра список, то она запишет элементы друг за другом в одну строку. Но можно поступить следующим образом: в качестве параметра передать генератор следующим образом.
Этот пример отличается от предыдущего тем, что вызывается метод writelines, который принимает в качестве аргумента генератор. Для разделения элементов последовательности тут применяется “\n”, благодаря чему каждое слово в документе будет находиться в отдельной строке.
Чтение построчно
Прочитать содержимое текстового файла построчно в языке Python очень просто, поскольку в этом прекрасно помогает цикл for. Но для начала все же необходимо открыть документ, как и в предыдущем случае, при помощи open и with as. Однако на этот раз следует указать другой режим обработки файла, выбрав для него “r” для получения доступа к чтению данных.
В этом примере показывается открытие файла test.txt, в котором уже содержится небольшой массив строк, записанный ранее. Построчное чтение информации из файла производится в цикле for. Каждая итерация выводит сведения из новой строки (line) при помощи функции print. Все элементы отображаются на экране построчно, как и были ранее помещены в test.txt.
Количество строк
Возможности языка Python позволяют производить и куда более сложные виды программных операций с внутренним содержимым текстовых файлов. Например, если требуется определить в Python количество строк в файле, можно открыть файл и в цикле посчитать количество занятых в нем строк. В этом поможет предварительно объявленная переменная count, в которую перед применением нужно записать 0, а затем прибавлять по единице с каждой новой строкой.
Приведенный выше пример демонстрирует работу счетчика count. Для взаимодействия с ним следует открыть текстовый файл в режиме чтения, а затем инкрементировать в каждом новом шаге цикла for объявленную ранее числовую переменную, которая затем выводится в print.
Можно поступить и другим способом. Прочитать файл в список с помощью readlines. А после этого с помощью функции len определить размер списка. Это и будет количество строк.
Поиск строки
Чтобы с помощью Python найти строку в текстовом файле, стоит прибегнуть к помощи встроенного метода readlines, который позволяет автоматически считывать внутреннее содержимое файла. Как и раньше, для начала необходимо открыть test.txt для чтения, чтобы затем поместить данные из него в специальный массив lines. Встроенный метод index позволяет найти номер элемента в последовательности, просто передав ему нужный объект, например, строку “second”.
Поскольку в test.txt все элементы располагаются в отдельных строках, к строке, которую стоит передать методу index в качестве аргумента, необходимо прибавить конструкцию “\n”.
Удаление строки
Чтобы в Python удалить ненужную строку из файла, следует воспользоваться сразу двумя режимами обработки файлов: чтение и запись. Для начала необходимо открыть test.txt для чтения, чтобы поместить информацию из него в отдельный массив lines. Далее потребуется удалить один из элементов последовательности при помощи оператора del, указав ему индекс нужной строки в квадратных скобках. Массив объектов, который получился в итоге, необходимо поместить в исходный текстовый файл, однако на этот раз открыть его надо в режиме записи.
Приведенный выше пример небольшой программы демонстрирует удаление строки из файла. В данном случае используются методы readlines и writelines, позволяющие считывать массив строк из документа и записывать его туда же, разделяя отдельные элементы списка.
Таким образом, можно достаточно легко взаимодействовать с содержимым текстовых файлов, пользуясь языком программирования Python 3. Его встроенные функции позволяют записывать данные в документ и считывать их в удобном для пользователя виде. При помощи средств по расширенной работе с файлами, можно управлять ими на куда более продвинутом уровне.
Работа с файлами в Python
В этой статье вы узнаете как организовать работать с файлами в Python 3.
Создайте файл files.py и копируйте туда код из примеров.
Запустить файл можно командой
Создать
Создать файл можно командой open
rb чтение в бинарном режиме
rt чтение в текстовом режиме
w только запись.
wb запись в бинарном режиме
wt запись в текстовом режиме
w+ запись и чтение
a запись в конец файла — сохранит данные, которые были в файле
b — это селектор бинарного режима
t — это селектор текстового режима
Любая опция с w перезапишет существующий файл — будьте внимательны!
f = open («log.txt»,»w+»)
Кодировка
import sys print (sys.getdefaultencoding())
Открыть файл
open ( path_to_file , mode , encoding )
По умолчанию используется кодировка utf-8
Чтобы открыть файл для чтения выполните
f = open («log.txt»,»r»)
Если файл log.txt не существует, он не будет создан
raceback (most recent call last): File «files.py», line 1, in <module> f = open('log.txt', 'r') FileNotFoundError: [Errno 2] No such file or directory: 'log.txt'
Закрыть файл
Чтобы закрыть файл выполните
Менеджер контекста
Предпочтительнее использовать менеджер контекста для работы с файлами
Как только вы выйдете из блока в котором открыт файл — он автоматически закроется
with open ('text.txt', 'r') as f: pass print (f.closed)
Будем рассматривать примеры работы с файлами как с использованием менеджера контекста так и без него.
read(): чтение файла
Получать данные из файла можно с помощью read()
В неё можно передавать аргумент типа int и тогда будет возвращено соответсвующее количество байт содераждания файла.
Прочитать содержимое файла
with open ('sites.txt', 'r') as f: f_contents = f.read() print (f_contents)
www.urn.su www.heihei.ru www.topbicycle.ru
Рассмотрим файл sites.md который состоит из одной строки
Чтобы получить всё что осталось в файл нужно вызвать read() без аргументов.
Если вызвать read() ещё раз, вернётся пустая строка
В данный момент указатель стоит на конце файла, но его можно переместить с помощью seek()
seek(0): перемещение в начало файла
С помощью seek(0) можно поставить указатель в начало файла.
Перейдём в конец файла sites.md
Теперь с помощью seek() поставим указатель в начало
Очистить файл
readline(): построчное чтение
Метод readline() выводит содержимое построчно.
А метод readlines() выводит все строки в виде списка
Все строки с символом перехода на новую строку — readlines
with open ('sites.txt', 'r') as f: f_contents = f.readlines() print (f_contents)
Строки по одной readline
with open ('sites.txt', 'r') as f: f_contents = f.readline() print (f_contents) f_contents = f.readline() print (f_contents)
Строки по одной без лишних переходов end=''
with open ('sites.txt', 'r') as f: f_contents = f.readline() print (f_contents, end = '') f_contents = f.readline() print (f_contents, end = '')
Цикл для построчного вывода
with open ('sites.txt', 'r') as f: for line in f: print (line, end = '')
www.urn.su www.heihei.ru www.topbicycle.ru
В качестве альтернативы можно использовать sys.stdout.write()
import sys f = open (sys.argv[ 1 ], mode= 'rt' , encoding= 'utf-8' ) for line in f: sys.stdout.write(line) f.close()
python files.py sites.txt
www.urn.su www.heihei.ru www.topbicycle.ru
Прочитать определённое количество символов
with open ('sites.txt', 'r') as f: f_contents = f.read(20) print (f_contents)
Если выполнять эту команду последовательно — будут прочитаны следующие символы
with open ('sites.txt', 'r') as f: f_contents = f.read(20) print (f_contents, end = '') f_contents = f.read(20) print (f_contents, end = '')
www.urn.su www.heihei.ru www.topbicycle.
Цикл для произвольного количества символов .read
with open ('sites.txt', 'r') as f: size_to_read = 10 f_contents = f.read(size_to_read) while len(f_contents) > 0: print (f_contents, end = '') f_contents = f.read(size_to_read)
www.urn.su www.heihei.ru www.topbicycle.ru
Выражение f_contents = f.read(size_to_read) нужно для того, чтобы когда файл закончится и f.read(size_to_read) станет нулем len(f_contents) тоже станет нулем и цикл завершится
Имя файла
Пример программы, которая выводит на экран имя файла и режим, в котором он открыт
f = open ('log.txt', 'r') print (f.name) print (f.mode) f.close()
Если файл log.txt существует, то в терминале вы увидите
Копирование файлов
Текстовые файлы
Их можно копировать построчно
with open ('sites.txt', 'r') as rf: with open ('sites_copy.txt', 'w') as wf: for line in rf: wf.write(line)
www.urn.su www.heihei.ru www.topbicycle.ru
Изображения
Их тоже можно копировать построчно, но открывать и записывать нужно в побитовом режиме. То есть нужно добавлять опцию b
Скачайте изображение велосипеда с сайта TopBicycle.ru или возьмите любую другую картинку
wget https://topbicycle.ru/b/img/stels_pilot_950_MD_26.jpg
ls
with open ('stels_pilot_950_MD_26.jpg', 'rb') as rf: with open ('stels_pilot_950_MD_26_copy.jpg', 'wb') as wf: for line in rf: wf.write(line)
python3 files.py
ls
Более правильным подходом считается копирование не в построчном режиме а частями с фиксированным размером
with open ('stels_pilot_950_MD_26.jpg', 'rb') as rf: with open ('stels_pilot_950_MD_26_copy.jpg', 'wb') as wf: chunk_size = 4096 rf_chunk = rf.read(chunk_size) while len(rf_chunk) > 0: wf.write(rf_chunk) rf_chunk = rf.read(chunk_size)
Записать файл
Чтобы очистить файл от старого содержимого и записать в него новое используется опция w (write)
with open ('log.txt', 'w') as f: f.write(«some text»)
13 и 9 это число байт переданное в файл
cat sites.md www.topbicycle.ru www.heihei.ru eth1.ruwww.aviasales.ru www.booking.comwww.tutu.ru www.velodrive.ruwww.velosklad.ru%
-rw-r—r— 1 andrei users 23 Mar 12 17:59 sites.md
Конечный размер файла будет зависеть от опецарионной системы.
В Windows и Linux разные переносы строк, поэтому когда Python применяет свой универсальный перенос строки количество байт может увеличится на 1 а может остаться прежним.
write() возвращает количество байт, переданных в файл, а не фактический размер записанных данных.
Дописать в файл
Если нужно добавить новые данные к предыдущему содержимому без удаления — используется опция a (append)
with open ('log.txt', 'a') as f: f.write(«some text»)
Рассмотрим пример добавления данных в файл sites.md с помощью метода writelines()
www.topbicycle.ru www.heihei.ru www.eth1.ru
www.topbicycle.ru www.heihei.ru eth1.ruwww.aviasales.ru www.booking.comwww.tutu.ru www.velodrive.ruwww.velosklad.ru
Видно, что переносы строк появились только там, где из указали вручную.
Записать json в файл
import json # нужно где-то взять json r = urllib.request.urlopen('http://urn.su/api/v1/getjson') rr = r.read() rj = json.loads(rr) with open ('file.txt', 'w') as f: json.dump(rj, f)
Удалить первые несколько строк файла
with open ('log.txt', 'a') as fin: data = fin.readlines()[1:] with open ('new.txt', 'w') as fout: fout.writelines(data)
Запись вывода программы в файл
Если вы запускаете скрипт из терминала, воспользуйтесь перенаправлением
python script.py > script.log
В самом скрипте можно временно подменить стандартный вывод.
Допустим я делаю запрос к API
import sys … # Сохраним ссылку на оригинальный stdout original_stdout = sys.stdout with open ( «log.txt» , «a» ) as f: sys.stdout = f print (resp.data) sys.stdout = original_stdout
Тоже самое, если приходит json и хочется записать его красиво
import sys import json … with open («log.txt», «a») as f: sys.stdout = f print (json.dumps(resp.data, indent=4)) sys.stdout = original_stdout
Последовательность Рекамана
import sys from itertools import count, islice def sequence (): """Generate Recaman's sequence.""" seen = set () a = 0 for n in count( 1 ): yield a seen.add(a) c = a — n if c < 0 or c in seen: c = a + n a = c def write_sequence (filename, num): """Write Recaman's sequence to a text file.""" f = open (filename, mode= 'wt' , encoding= 'utf-8' ) f.writelines( f "
python recaman.py recaman.dat 1000
cat recaman.dat
1 3 6 2 7 … 2687 3685 2686 3686
"""Read and print an integer series.""" import sys def read_series (filename): f = open (filename, mode= 'rt' , encoding= 'utf-8' ) series = [] for line in f: a = int (line.strip()) series.append(a) f.close() return series def main (filename): series = read_series(filename) print (series) if __name__ == "__main__" : filename = sys.argv[ 1 ] main(filename)
python series.py recaman.dat
[0, 1, 3, 6, 2, 7 … 3684, 2687, 3685, 2686, 3686]
Если в файле будут неподходящие данные ошибка будет показана в Traceback, а до закрытия файла дело не дойдёт.
echo badidea >> recaman.dat
python series.py recaman.dat
Traceback (most recent call last): File "/home/andrei/series.py", line 21, in <module> main(filename) File "/home/andrei/series.py", line 15, in main series = read_series(filename) File "/home/andrei/series.py", line 8, in read_series a = int(line.strip()) ValueError: invalid literal for int() with base 10: 'badidea'
Это серьёзная проблема, и обычно решается использованием менеджера контекста , но можно решить и добавлением try , finally
Модифицируем функцию read_series() заодно добавив генератор списка
def read_series (filename): try : f = open (filename, mode= 'rt' , encoding= 'utf-8' ) return [ int (line.strip()) for line in f] finally : f.close()
С with получается короче.
def read_series (filename): with open (filename, mode= 'rt' , encoding= 'utf-8' ) as f: return [ int (line.strip()) for line in f]
В write_sequence() из recaman.py тоже лучше применить with
def write_sequence (filename, num): """Write Recaman's sequence to a text file.""" with open (filename, mode= 'wt' , encoding= 'utf-8' ) as f: f.writelines( f "
Пример работы с bytes
"""A module for dealing with BMP bitmap image files.""" def write_grayscale (filename, pixels): """Creates and writes a grayscale BMP file. Args: filename: The name of the BMP file to be created. pixels: A rectangular image stored as a sequence of rows. Each row must be an iterable series of integers in the range 0-255. Raises: ValueError: If any of the integer values are out of range. OSError: If the file couldn't be written. """ height = len (pixels) width = len (pixels[ 0 ]) with open (filename, 'wb' ) as bmp: # BMP Header bmp.write(b 'BM' ) size_bookmark = bmp.tell() # The next four bytes hold the filesize as a 32-bit bmp.write(b ' \x00\x00\x00\x00 ' ) # little-endian integer. Zero placeholder for now. bmp.write(b ' \x00\x00 ' ) # Unused 16-bit integet — should be zero bmp.write(b ' \x00\x00 ' ) # Unused 16-bit integet — should be zero pixel_offset_bookmark = bmp.tell() # The next four bytes hold the integer offset to the bmp.write(b ' \x00\x00\x00\x00 ' ) # pixel data. Zero placeholder for now. # Image Header bmp.write(b ' \x28\x00\x00\x00 ' ) # Image header size in bytes — 40 decimal bmp.write(_int32_to_bytes(width)) # Image width in pixels bmp.write(_int32_to_bytes(height)) # Image height in pixels bmp.write(b ' \x01\x00 ' ) # Number of image planes bmp.write(b ' \x08\x00 ' ) # Bits per pixel 8 for grayscale bmp.write(b ' \x00\x00\x00\x00 ' ) # No compression bmp.write(b ' \x00\x00\x00\x00 ' ) # Zero for uncompressed images bmp.write(b ' \x00\x00\x00\x00 ' ) # Unused pixels per meter bmp.write(b ' \x00\x00\x00\x00 ' ) # Unused pixels per meter bmp.write(b ' \x00\x00\x00\x00 ' ) # Use whole color table bmp.write(b ' \x00\x00\x00\x00 ' ) # All colors are important # Color palette — a linear grayscale for c in range ( 256 ): bmp.write( bytes ((c, c, c, 0 ))) # Blue, Green, Red, Zero # Pixel data pixel_data_bookmark = bmp.tell() for row in reversed (pixels): # BMP files are bottom to top row_data = bytes (row) bmp.write(row_data) padding = b ' \x00 ' * (( 4 — ( len (row) % 4 )) % 4 ) # Pad row to multiple of four bytes bmp.write(padding) # End of file eof_bookmark = bmp.tell() # Fill in file size placeholder bmp.seek(size_bookmark) bmp.write(_int32_to_bytes(eof_bookmark)) # Fill in pixel offset placeholder bmp.seek(pixel_offset_bookmark) bmp.write(_int32_to_bytes(pixel_data_bookmark)) def _int32_to_bytes (i): """Convert an integer to four bytes in little-endian format.""" # &: Bitwise-and # >>: Right-shift return bytes ( (i & 0xff , i >> 8 & 0xff , i >> 16 & 0xff , i >> 24 & 0xff ) )
import math def mandel (real, imag): """The logarighm of number of iterations needed to determine whether a complex point is in the Mandelbrot set. Args: real: The real coordinate imag: The imaginary coordinate Returns: An integer in the range 1-255. """ x = 0 y = 0 for i in range ( 1 , 257 ): if x*x + y*y > 4.0 : break xt = real + x*x — y*y y = imag + 2.0 * x * y x = xt return int (math.log(i) * 256 / math.log( 256 )) — 1 def mandelbrot (size_x, size_y): """Make an Mandelbrot set image. Args: size_x: Image width size_y: Image height Returns: A list of lists of integers in the range 0-255 """ return [[mandel(( 3.5 * x / size_x) — 2.5 , ( 2.0 * y / size_y) — 1.0 ) for x in range (size_x)] for y in range (size_y)]
>>> import fractal >>> pixels = fractal.mandelbrot(448, 256) >>> import reprlib >>> reprlib.repr(pixels)
'[[31, 31, 31, 31, 31, 31, . ], [31, 31, 31, 31, 31, 31, . ], [31, 31, 31, 31, 31, 31, . ], [31, 31, 31, 31, 31, 31, . ], [31, 31, 31, 31, 31, 31, . ], [31, 31, 31, 31, 31, 31, . ], . ]'
>>> import bmp >>> bmp.write_grayscale("mandel.bmp", pixels)
Определение размеров bmp изображения
def dimensions (filename): """Determine the dimensions in pixels of a BMP image. Args: filename: The filename of a BMP file. Returns: A tuple containing two integers with the width and height in pixels. Raises: ValueError: If the file was not a BMP file. OSError: If there was a problem reading the file. """ with open (filename, 'rb' ) as f: magic = f.read( 2 ) if magic != b 'BM' : raise ValueError (f "
encode()
Преобразовать в «кириллический» iso-8859-5 не получится
>>> j.encode('iso-8859-5') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python3.8/encodings/iso8859_5.py", line 12, in encode return codecs.charmap_encode(input,errors,encoding_table) UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-1: character maps to <undefined>
j.encode('iso-8859-5') # это тоже что и j.encode('iso-8859-5', errors='strict')
Определить кодировки файлов
Пример скрипта для определения кодировок файлов. О том как создать файлы в разных кодировках в Linux читайте здесь
python -m pip install python-magic
import magic def get_encoding (sample): blob = open (sample, 'rb' ).read() m = magic.open(magic.MAGIC_MIME_ENCODING) m.load() encoding = m.buffer(blob) return encoding files = [ 'utf-8-file' , 'windows-1251-file' , 'shift-jis-file' ] for f in files: print (get_encoding(f))
utf-8 iso-8859-1 unknown-8bit
С определением SHIFT-JIS пока проблемы
Путь до файла
python -m pip install pathlib
import pathlib from pathlib import Path dir_path = pathlib.Path.cwd() print (dir_path)
Прочитать файл из другой директории
Предположим, что мы находимся в директории one проекта file_path:
file_path/ ├── one │ └── path.py └── two └── sites.txt
Прочитать файл sites.txt с помощью Python поможет библиотека pathlib
import pathlib from pathlib import Path dir_path = pathlib.Path.cwd() path = Path(dir_path, ".." , "two" , "sites.txt" ) with open (path, "r" ) as f: sites = f.read() print (sites)
Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых