Основы работы с файлами в python

5 функций для отладки

Эти функции часто игнорируются, но будут полезны для отладки и устранения неисправностей кода.

breakpoint

Если нужно приостановить выполнение кода и перейти в командную строку Python, эта функция вам пригодится. Вызов перебросит вас в отладчик Python.

Эта встроенная функция была добавлена в Python 3.7, но если вы работаете в более старых версиях, можете получить тот же результат с помощью .

dir

Эта функция может использоваться в двух случаях:

  • просмотр списка всех локальных переменных;
  • просмотр списка всех атрибутов конкретного объекта.

Из примера можно увидеть локальные переменные сразу после запуска и после создания новой переменной .

Если в передать созданный список , на выходе можно увидеть все его атрибуты.

В выведенном списке атрибутов можно увидеть его типичные методы (, , и т. д.) , а также множество более сложных методов для перегрузки операторов.

vars

Эта функция является своего рода смесью двух похожих инструментов: и .

Когда вызывается без аргументов, это эквивалентно вызову , которая показывает словарь всех локальных переменных и их значений.

Когда вызов происходит с аргументом, получает доступ к атрибуту , который представляет собой словарь всех атрибутов экземпляра.

Перед использованием было бы неплохо сначала обратиться к .

type

Эта функция возвращает тип объекта, который вы ей передаете.

Тип экземпляра класса есть сам класс.

Тип класса — это его метакласс, обычно это .

Атрибут даёт тот же результат, что и функция , но рекомендуется использовать второй вариант.

Функция , кроме отладки, иногда полезна и в реальном коде (особенно в объектно-ориентированном программировании с наследованием и пользовательскими строковыми представлениями).

Обратите внимание, что при проверке типов обычно вместо используется функция. Также стоит понимать, что в Python обычно не принято проверять типы объектов (вместо этого практикуется утиная типизация)

help

Если вы находитесь в Python Shell или делаете отладку кода с использованием , и хотите знать, как работает определённый объект, метод или атрибут, функция поможет вам.

В действительности вы, скорее всего, будете обращаться за помощью к поисковой системе. Но если вы уже находитесь в Python Shell, вызов будет быстрее, чем поиск документации в Google.

Обязательные

Мы можем предоставить аргументы во время вызова функции. Обязательные аргументы – это аргументы, которые необходимо передать во время вызова функции с точным совпадением их позиций в вызове функции и определении функции. Если какой-либо из аргументов не указан в вызове функции или положение аргументов изменено, интерпретатор Python покажет ошибку.

Рассмотрим следующие примеры.

Пример 1.

def func(name):  
    message = "Hi "+name
    return message
name = input("Enter the name:")  
print(func(name))  

Выход:
Пример 2.

#the function simple_interest accepts three arguments and returns the simple interest accordingly  
def simple_interest(p,t,r):  
    return(p*t*r)/100  
p = float(input("Enter the principle amount? "))  
r = float(input("Enter the rate of interest? "))  
t = float(input("Enter the time in years? "))  
print("Simple Interest: ",simple_interest(p,r,t))  

Выход:
Пример 3

#the function calculate returns the sum of two arguments a and b  
def calculate(a,b):  
    return a+b  
calculate(10) # this causes an error as we are missing a required arguments b.  

Выход:

Стилизированный print

pprint

С помощью модуля pprint, который входит в стандартную библиотеку Python, можно более наглядно отображать некоторые объекты, при этом структура их сохраняется.

Один из примеров использования модуля — словарь со вложенными словарями:

вместо длинной строки будет отображен так:

Есть необязательный параметр depth и indent. Depth указывает — ключи какого уровня вложенности отображать, скрытые уровни будут заменены на троеточие. Indent устанавливает размер отступов:

reprlib

Модуль reprlib позволяет использовать функцию , благодаря которой сокращается отображение глубоко вложенных или больших контейнеров, а также множества рекурсивных вызовов:

json.dumps

Словари часто представляют собой данные JSON, широко используемые во всемирной сети. Для правильной стилизации словаря в строку JSON можно воспользоваться одноименным модулем, который имеет хорошие возможности печати:

результат:

Параметры

Как было сказано, можно вызывать без всяких аргументов при необходимости создать пустую строку, или указывать один аргумент для вывода сообщения. Кроме того, функция может принимать любое количество позиционных аргументов, разделяя их запятой, что очень удобно при необходимости объединения нескольких элементов.

Полная версия print выглядит так:

  • *objects — объект/объекты которые необходимо вывести;
  • sep — разделитель между объектами. В качестве своего значения можно передавать строку или None (по умолчанию пробел » «);
  • end — символ в конце строки (по умолчанию перенос строки \n);
  • file — file-like объект (по умолчанию sys.stdout);
  • flush — принудительный сброс потока (по умолчанию False).

Импорты

Каждый импорт, как правило, должен быть на отдельной строке.

Хорошо

Плохо

В то же время, можно писать так:

Хорошо

Импорты всегда располагаются в начале файла, сразу после комментариев уровня модуля, строк документации, перед объявлением констант и объектов уровня модуля. Импорты должны быть сгруппированы в порядке от самых простых до самых сложных:

  • импорты из стандартной библиотеки,
  • сторонние импорты,
  • импорты из библиотек вашего приложения.

Наряду с группированием, импорты должны быть отсортированы лексикографически, нерегистрозависимо, согласно полному пути до каждого модуля.

Хорошо

Рекомендуется абсолютное импортирование, так как оно обычно более читаемо и ведет себя лучше (или, по крайней мере, даёт понятные сообщения об ошибках), если импортируемая система настроена неправильно (например, когда каталог внутри пакета заканчивается на ).

Хорошо

Тем не менее, явный относительный импорт является приемлемой альтернативой абсолютному импорту, особенно при работе со сложными пакетами, где использование абсолютного импорта было бы излишне подробным.

Хорошо

Следует избегать шаблонов импортов (), так как они делают неясным то, какие имена присутствуют в глобальном пространстве имён, что вводит в заблуждение как читателей, так и многие автоматизированные средства.

Интерполяция строк

За этим сложным названием кроется очень простое действие: объединение переменных и констант внутри строки.

Удалите код, который вы ввели ранее и оставьте только эту строку:

var name = "Tim McGraw"

Если нужно показать пользователю сообщение с его именем, интерполяция строк поможет упростить этот процесс. Вы просто вставляете обратную косую черту, ставите открывающую скобку, пишите код и добавляете закрывающую скобку:

var name = "Tim McGraw"
"Your name is \(name)"

На панели результатов в одну строку отобразится текст «Your name is Tim McGraw», поскольку интерполяция объединила две отдельные строки в одну.

Такого же результата можно добиться, используя оператор «+»:

var name = "Tim McGraw"
"Your name is " + name

Но этот способ нецелесообразен, в особенности, когда нужно объединить сразу несколько переменных разных типов.

Кроме того, интерполяция строк в Swift распознает разные типы данных автоматически. Например:

var name = "Tim McGraw"
var age = 25
var latitude = 36.166667
"Your name is \(name), your age is \(age), and your latitude is \(latitude)"

Выполнить операции выше с помощью оператора «+» значительно сложнее, поскольку Swift не позволяет добавлять данные типа Integer и Double в строки.

Сейчас результаты выполнения кода уже могут не помещаться на панели результатов. Чтобы отобразить результаты, измените размер окна или наведите указатель мыши на результат и щелкните кнопку «+», которая появится.

Одна из важных возможностей интерполяции строк это то, что между \( и ) может находиться целое выражение на Swift, например:

var age = 25
"You are \(age) years old. In another \(age) years you will be \(age * 2)."

Сегодня мы узнали об автоматическом аннотировании типов данных в Swift, которое предупреждает ошибки присвоения переменной неверного значения, и процедуре интерполяции строк, с помощью которой можно объединить несколько переменных и констант внутри одной строки. В следующий раз мы поговорим о массивах.

Читайте далее: Основы Swift. Массивы

Нужен MVP, разработка под iOS, Android или прототип приложения? Ознакомьтесь с нашим портфолио и сделайте заказ уже сегодня!

Аргументы в функции

Аргументы – это типы информации, которые можно передать функции. Аргументы указаны в скобках. Мы можем передать любое количество аргументов, но они должны быть разделены запятой.

Рассмотрим следующие примеры, содержащий функцию, которая принимает строку в качестве аргумента.

Пример 1.

#defining the function  
def func(name):  
    print("Hi ",name) 
#calling the function   
func("Devansh")   

Выход:

Hi Devansh

Пример 2.

#Python function to calculate the sum of two variables   
#defining the function  
def sum(a,b):  
    return a+b;  
  
#taking values from the user  
a = int(input("Enter a: "))  
b = int(input("Enter b: "))  
  
#printing the sum of a and b  
print("Sum = ",sum(a,b))  

Выход:

Enter a: 10
Enter b: 20
Sum =  30

5.1.5. Побочный эффект¶

Побочный эффект (англ. Side Effect) — любые действия программы, изменяющие среду выполнения (англ. Execution Environment).

К побочным эффектам выполнения функции можно отнести:

  • изменение данных в памяти;

  • чтение/запись файла или устройства;

  • ввод/вывод значений;

  • самостоятельную реакцию на исключительные ситуации;

  • и др.

Часто функции с побочным эффектом при вызове несколько раз с одними и теми же аргументами в качестве результата возвращают разные значения. Пример — стандартная функция генерации случайного числа.

Создавая функцию, необходимо избегать побочных эффектов — такие функции легче тестируются и не содержат скрытых действий. Один из примеров такой функции — функция в .

Естественно, что полностью избежать побочных эффектов невозможно. В таких случаях необходимо локализовать участки кода с побочным эффектом в отдельные функции (Листинге 5.1.16).

Листинг 5.1.16 — Локализация кода с побочным эффектом в отдельные функции |

def heron(a, b, c):
    """Вернуть площадь треугольника по формуле Герона.

    Параметры:
        - a, b, c (float): стороны треугольника.

    Результат:
        - float: значение площади.
        - None: если треугольник не существует.
    """
    if not (a + b > c and a + c > b and b + c > a):
        return

    p = (a + b + c)  2
    return (p * (p - a) * (p - b) * (p - c))**0.5


def input_data():
    """Запросить стороны треугольника с клавиатуры.

    Результат:
        - tuple of float: (a, b, c).

    Побочный эффект!
    """
    return (float(x) for x in input('Введите стороны (a b c): ').split())

def print_res(res):
    """Вывести на экран 'res'.

    Параметры:
        - res (float): площадь треугольника.

    Побочный эффект!
    """
    if res
        print('S = {:.2f}'.format(res))
    else
        print('Треугольник не существует!')


a, b, c = input_data()
res = heron(a, b, c)
print_res(res)

Предупреждение

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

Например, если необходимо вычислить сумму и среднее значение элементов списка, правильнее будет создать 2 функции для каждого вычисления, а не одну; при этом ввод и вывод значений также оформить в виде отдельных функций.

Операции с файловой системой

Управление файлами выполняется очень просто в язык программирования Python, это лучший язык для работы с файлами. Да и вообще, можно сказать, что Python — это самый простой язык.

1. Копирование файлов

Для копирования файлов нужно использовать функции из модуля subutil:

Если file1 — символическая ссылка, операция копирования все равно создаст отдельный файл. Если вы хотите скопировать именно символическую ссылку используйте такую конструкцию:

2. Перемещение файлов

Перемещение файлов выполняется с помощью функции move:

Функция rename из модуля os позволяет переименовывать файлы:

3. Чтение и запись текстовых файлов

Вы можете использовать встроенные функции для открытия файлов, чтения или записи данных в них:

Сначала нужно открыть файл для работы с помощью функции open. Для чтения данных из файла используется функция read, прочитанный текст будет сохранен в переменную. Вы можете указать количество байт, которые нужно прочитать:

Если файл слишком большой, вы можете разбить его на строки и уже так выполнять обработку:

Чтобы записать данные в файл, его сначала нужно открыть для записи. Есть два режима работы — перезапись и добавление в конец файла. Режим записи:

И добавление в конец файла:

5. Получение времени создания

Вы можете использовать функции getmtime(), getatime() и getctime() для получения времени последнего изменения, последнего доступа и создания. Результат будет выведен в формате Unix, поэтому его нужно конвертировать в читаемый вид:

6. Список файлов

С помощью функции listdir() вы можете получить список файлов в папке:

Для решения той же задачи можно использовать модуль glob:

7. Сериализация объектов Python

Сериализация позволяет сохранить объект в строку, для его последующего восстановления. Для этого используйте модуль pickle:

Затем для восстановления объекта используйте:

8. Сжатие файлов

Стандартная библиотека Python позволяет работать с различными форматами архивов, например, zip, tar, gzip, bzip2. Чтобы посмотреть содержимое файла используйте:

А для создания zip архива:

Также вы можете распаковать архив:

Вы можете добавить файлы в архив так:

9. Разбор CSV и Exel файлов

С помощью модуля pandas можно смотреть и разбирать содержимое CSV и Exel таблиц. Сначала нужно установить модуль с помощью pip:

Затем для разбора наберите:

По умолчанию pandas использует первую колонку для заголовков каждой из строк. Вы можете задать колонку для индекса с помощью параметра index_col или указать False, если он не нужен. Чтобы записать изменения в файл используйте функцию to_csv:

Таким же образом можно разобрать файл Exel:

Если нужно открыть все таблицы, используйте:

Затем можно записать все данные обратно:

Работа с сетью в Python

Программирование на Python 3 часто включает работу с сетью. Стандартная библиотека Python включает в себя возможности работы с сокетами для доступа к сети на низком уровне. Это нужно для поддержки множества сетевых протоколов.

Этот код подключается к порту 4040 на машине 192.168.1.5. Когда сокет открыт, вы можете отправлять и получать данные:

Нам необходимо писать символ b, перед строкой, потому что надо передавать данные в двоичном режиме. Если сообщение слишком большое, вы можете выполнить итерацию:

Для получения данных вам тоже нужно открыть сокет, только используется метод my_sock_recv:

Здесь мы указываем сколько данных нужно получить — 20000, данные не будут переданы в переменную, пока не будет получено 20000 байт данных. Если сообщение больше, то для его получения нужно создать цикл:

Если буфер пуст, туда будет записано полученное сообщение.

Ключевые аргументы

Когда вы используете ключевые аргументы в вызове функции, вызывающая сторона идентифицирует аргументы по имени параметра. Плюс в определении функции у ключевого параметра можно указать значение по-умолчанию.

Это позволяет пропускать аргументы или размещать их не по порядку, поскольку интерпретатор Python может использовать предоставленные ключевые слова (ключи) для сопоставления значений с параметрами. Создадим ключевые слова для функции printinfo() следующими способами:

# Определение функции
def printinfo( name, age ):
   "This prints a passed info into this function"
   print("Name: " + name + "|Age: " + str(age))
   return

# Вызов функции printinfo
printinfo( age=23, name="Anton" )
printinfo( name="Alena", age=20 )

Результат:

Name: Anton|Age: 23
Name: Alena|Age: 20

Преимущества ключевых аргументов в функциях

  • Нет необходимости отслеживать порядок аргументов;
  • У ключевых параметров есть значение по умолчанию, которое можно не передавать.

Чтение файла построчно

Python упрощает чтение файла построчно с помощью метода readline(). Метод readline() читает строки файла с самого начала, т. е. если мы используем его два раза, мы можем получить первые две строки файла.

Рассмотрим следующий пример, который содержит функцию readline(), которая читает первую строку нашего файла «file2.txt», содержащую три строки.

Пример 1: чтение строк с помощью функции readline()

#open the file.txt in read mode. causes error if no such file exists.  
fileptr = open("file2.txt","r");   
#stores all the data of the file into the variable content  
content = fileptr.readline()   
content1 = fileptr.readline()
#prints the content of the file  
print(content)   
print(content1)
#closes the opened file  
fileptr.close()  

Выход:

Python is the modern day language.

It makes things so simple.

Мы вызывали функцию readline() два раза, поэтому она считывает две строки из файла.

Python также предоставляет метод readlines(), который используется для чтения строк. Возвращает список строк до конца файла(EOF).

Пример 2: чтение строк с помощью функции readlines()

#open the file.txt in read mode. causes error if no such file exists.  
fileptr = open("file2.txt","r");   
  
#stores all the data of the file into the variable content  
content = fileptr.readlines()   

#prints the content of the file  
print(content)   
  
#closes the opened file  
fileptr.close()  

Выход:

Изменение регистра символов в строках в Python.

Одной из частых операций, выполняемых со строками — это изменение регистра символов. Например, у нас есть переменная name, в которой сохранена строка «Hello world!». Для преобразования символов к верхнему или нижнему регистру существует несколько методов.

>>> name = «Hello world!»
>>> print(name.title())Hello World!
>>> print(name.upper())HELLO WORLD!
>>> print(name.lower())hello world!

В первом случае за именем переменной в команде print() следует вызов метода title(). Метод — это действие, которое Python выполняет с данными. Точка после name приказывает Python применить метод title() к переменной name. За именем метода всегда следует пара круглых скобок (). Методам для выполнения их работы часто требуется дополнительные данные, и они указываются в скобках. В данный момент дополнительная информация не нужна, поэтому в скобках ничего нет. Метод title() преобразует первый символ каждого слова к верхнему регистру, остальные символы выводятся, как и были. Во втором случае используется метод upper(), в котором все символы преобразовываются к верхнему регистру. В третьем случае в методе lower() идет преобразование всех символов к нижнему регистру.

Метод lower() очень часто используется для хранения данных. Редко при вводе данных все пользователи вводят данные с точным соблюдением регистра. После ввода все данные преобразуются к нижнему регистру и уже затем выводится информация с использованием регистра, наиболее подходящего.

Решение задач

1. Поэкспериментируйте с переводом в различные типы данных

2. Пользователь вводит свое имя и фамилию. Выведите:

Hello, имя фамилия
# На месте слов с % должны быть введенные данные

3. Посчитайте сумму трех введенных целых чисел

4. Посчитайте сумму трех введенных дробных чисел. Подумайте в какой тип данных нужно преобразовать значение, возвращенное функцией input

5. Дано число, выведите предыдущее и следущее за ним числа в таком формате:

# Число равно 10

Число предшествующее числу 10 равно 9

Число следующее за числом 10 равно 11

6. Вводятся имя и возраст. Выведите, где введенное имя = Максим, а возраст = 20

Привет, Максим! Ваш возраст равен 20!

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Люкс-хост
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: