- Python Data vs. Non-data Descriptors
- Non-data descriptor
- Data descriptor
- Summary
- Как читать файлы .data в Python?
- Что собой представляют файлы .data?
- Идентификация данных в файлах .data
- 1. Тестирование: текстовый файл
- 2. Тестирование: бинарный файл
- 3. Использование Pandas для чтения файлов .data
- Какие еще есть форматы для хранения данных?
- 1. Файлы JSON
- 2. Pickle
- Заключение
Python Data vs. Non-data Descriptors
Summary: in this tutorial, you’ll learn the differences between data and non-data descriptors.
- Data descriptors are objects of a class that implements __set__ method (and/or __delete__ method)
- Non-data descriptors are objects of a class that have the __get__ method only.
Both descriptor types can optionally implement the __set_name__ method. The __set_name__ method doesn’t affect the classification of the descriptors.
The descriptor types determine how Python resolves object’s attributes lookup.
Non-data descriptor
If a class uses a non-data descriptor, Python will search the attribute in instance attributes first ( instance.__dict__ ). If Python doesn’t find the attribute in the instance attributes, it’ll use the data descriptor.
Let’s take a look at the following example.
First, define a non-data descriptor class FileCount that has the __get__ method which returns the number of files in a folder:
class FileCount: def __get__(self, instance, owner): print('The __get__ was called') return len(os.listdir(instance.path))
Code language: Python (python)
Second, define a Folder class that uses the FileCount descriptor:
class Folder: count = FileCount() def __init__(self, path): self.path = path
Code language: Python (python)
Third, create an instance of the Folder class and access the count attribute:
folder = Folder('/') print('file count: ', folder.count)
Code language: Python (python)
Python called the __get__ descriptor:
The __get__ was called file count: 32
Code language: Python (python)
After that, set the count attribute of the folder instance to 100 and access the count attribute:
folder.__dict__['count'] = 100 print('file count: ', folder.count)
Code language: Python (python)
file count: 100
Code language: Python (python)
In this example, Python can find the count attribute in the instance dictionary __dict__ . Therefore, it does not use data descriptors.
Data descriptor
When a class has a data descriptor, Python will look for an instance’s attribute in the data descriptor first. If Python doesn’t find the attribute, it’ll look for the attribute in the instance dictionary ( __dict__ ). For example:
First, define a Coordinate descriptor class:
class Coordinate: def __get__(self, instance, owner): print('The __get__ was called') def __set__(self, instance, value): print('The __set__ was called')
Code language: Python (python)
Second, define a Point class that uses the Coordinate descriptor:
class Point: x = Coordinate() y = Coordinate()
Code language: Python (python)
Third, create a new instance of the Point class and assign a value to the x attribute of the p instance:
p = Point() p.x = 10
Code language: Python (python)
The __set__ was called
Code language: Python (python)
Python called the __set__ method of the x descriptor.
Finally, access the x attribute of the p instance:
p.x
Code language: Python (python)
The __get__ was called
Code language: Python (python)
Python called the __get__ method of the x descriptor.
Summary
- Data descriptors are objects of a class that implements __set__ method (and/or __delete__ method)
- Non-data descriptors are objects of a class that have the __get__ method only.
- When accessing object’s attributes, data descriptors override the instance’s attributes and instance’s attributes override non-data descriptors.
Как читать файлы .data в Python?
При вводе и сборе данных для учебных моделей мы сталкиваемся с файлами .data. Такое расширение используется некоторыми программами. Одним из примеров является Analysis Studio, специализирующаяся на статистическом анализе и добыче данных.
Работа с расширением файла .data довольно проста и сводится к определению способа сортировки данных с последующим использованием команд Python для доступа к файлу соответствующим образом.
Что собой представляют файлы .data?
Файлы .data были разработаны как средство хранения данных. Чаще всего данные в этом формате размещаются в формате значений, разделенных запятыми или табуляцией. Наряду с этим файл может быть в текстовом формате или в двоичном. Режимы доступа для этих двух случаев будут разными.
В этой статье мы будем работать с файлами, где данные хранятся в виде значений, разделенных запятыми, но давайте сначала определим, является ли содержимое файла текстовым или двоичным.
Идентификация данных в файлах .data
Файлы .data могут быть либо в виде текста, либо в двоичном виде. Чтобы выяснить, к какому из видов относится файл, нам нужно загрузить его и проверить.
1. Тестирование: текстовый файл
Файлы .data в основном существуют в виде текстовых файлов. Доступ к файлам в Python довольно прост, для этого есть встроенный функционал. То есть вам не придется что-либо импортировать.
Открытие, чтение и запись в файл в Python выглядят следующим образом:
# Открытие файла для чтения file = open("biscuits.data", "r") # Чтение файла file.read() # Закрытие файла file.close() # Открытие файла для записи file = open("biscuits.data", "w") # Запись файла file.write("Chocolate Chip") # Закрытие файла file.close()
2. Тестирование: бинарный файл
Файлы .data могут быть также в виде двоичных файлов. При открытии таких файлов нужно поменять режим доступа. Для чтения это будет режим rb (расшифровывается как read binary) , а для записи – wb (write binary).
# Открытие и чтение бинарного файла file = open("biscuits.data", "rb") file.read() file.close() # Открытие и запись бинарного файла file = open("biscuits.data", "wb") file.write("Oreos") file.close()
Файловые операции в Python относительно просты. Попробуйте разные режимы на практике, чтобы увидеть разницу между ними.
Какой-нибудь из этих подходов должен сработать и предоставить вам метод получения информации о содержимом, хранящемся в файле .data.
Теперь, когда мы знаем, в каком формате представлен файл, мы можем поработать с pandas, чтобы создать DataFrame для файла.
3. Использование Pandas для чтения файлов .data
Простым методом извлечения информации из этих файлов после проверки типа содержимого будет использование функции read_csv() , предоставляемой Pandas.
Примечание редакции: “csv” расшифровывается как “значения, разделенные запятыми”, а “tsv”, соответственно, “значения, разделенные табуляцией”.
import pandas as pd # Чтение csv-файла data = pd.read_csv('file.data', sep=",") print(data) # Чтение tsv-файла data = pd.read_csv('otherfile.data', sep="\t") print(data)
Этот метод также автоматически преобразует данные в датафрейм.
Ниже используется пример файла csv, который был переформатирован в файл .data. Доступ к нему осуществляется с помощью того же кода, который приведен выше.
Series reference Description Period Previously published Revised 0 PPIQ.SQU900000 PPI output index - All industries 2020.06 1183 1184 1 PPIQ.SQU900001 PPI output index - All industries excl OOD 2020.06 1180 1181 2 PPIQ.SQUC76745 PPI published output commodity - Transport sup. 2020.06 1400 1603 3 PPIQ.SQUCC3100 PPI output index level 3 - Wood product manufa. 2020.06 1169 1170 4 PPIQ.SQUCC3110 PPI output index level 4 - Wood product manufa. 2020.06 1169 1170 .. . . . . . 73 PPIQ.SQNMN2100 PPI input index level 3 - Administrative and s. 2020.06 1194 1195 74 PPIQ.SQNRS211X PPI input index level 4 - Repair & maintenance 2020.06 1126 1127 75 FPIQ.SEC14 Farm expenses price index - Dairy farms - Freight 2020.06 1102 1120 76 FPIQ.SEC99 Farm expenses price index - Dairy farms - All . 2020.06 1067 1068 77 FPIQ.SEH14 Farm expenses price index - All farms - Freight 2020.06 1102 1110 [78 rows x 5 columns]
Как видите, это действительно дало нам DataFrame в качестве вывода.
Какие еще есть форматы для хранения данных?
Иногда стандартный метод хранения данных просто не подходит. Итак, каковы альтернативы работе с файловым хранилищем?
1. Файлы JSON
Как метод хранения информации, JSON – замечательная структура данных, а огромная поддержка модуля JSON в Python очень облегчает работу с этим форматом.
Однако, чтобы работать с JSON в Python, вам нужно будет импортировать модуль json.
После построения JSON-совместимой структуры ее сохранение – это простая файловая операция с json-дампами.
# Дамп структуры в форме объекта JSON в файл with open("file.json", "w") as f: json.dumps(['foo', ], f) # С помощью этого модуля также можно отсортировать ключи и организовать красивый вывод with open("file.json", "w") as f: json.dumps(['foo', ], f, indent=4, sort_keys=True)
Обратите внимание, что мы делаем сброс в файл с помощью переменной f .
Эквивалентная функция для получения информации из файла JSON называется load .
with open('file.json') as f: data = json.load(f)
Это предоставляет нам структуру и информацию об объекте JSON внутри файла.
2. Pickle
Обычно, когда вы сохраняете информацию, она хранится в формате сырых строк, в результате чего объект теряет свои свойства, и для дальнейшего использования нам приходится восстанавливать его.
Для борьбы с этой проблемой используется модуль pickle, который был создан для сериализации и десериализации объектных структур Python, чтобы их можно было хранить в файле.
Это означает, что вы можете сохранить список при помощи pickle, и когда он будет загружен модулем pickle в следующий раз, вы не потеряете ни одного из свойств объекта списка.
Для того чтобы воспользоваться этим, нам нужно импортировать модуль pickle. Устанавливать его не нужно, так как он является частью стандартной библиотеки Python.
Давайте создадим словарь для работы со всеми нашими файловыми операциями.
apple = banana = orange = fruitShop = <> fruitShop["apple"] = apple fruitShop["banana"] = banana fruitShop["orange"] = orange
Работать с модулем pickle так же просто, как и с JSON.
file = open('fruitPickles', 'ab') # Режим 'ab' позволяет открывать # для дозаписи файл в бинарном формате # Метод dump добавляет данные в файл # в безопасном сериализованном формате. pickle.dump(fruitShop, file) file.close() file = open('fruitPickles', 'rb') # Теперь мы можем читать из файла при помощи функции load. fruitShop = pickle.load(file) file.close()
Заключение
Теперь вы знаете, что такое файлы .data и как с ними работать. Наряду с этим вы также познакомились с другими доступными вариантами хранения и получения данных.