Обработка данных Python (1): обработка данных JSON, XML, CSV в трех форматах

Python

Серия блогов по обработке данных на Python уже здесь!

Эта серия будет основана на книге «Обработка данных Python» и позволит вам изучить обработку данных Python в форме блога для каждой главы книги. Некоторые части книги не очень детализированы, я проверю другие материалы, чтобы дополнить их, и постараюсь охватить основные моменты в каждом блоге и сделать их простыми для понимания.

В этой книге в основном рассказывается о том, как использовать Python для обработки различных типов файлов, таких как JSON, XML, CSV, Excel, PDF и т. д. В последующих главах также будет рассмотрено использование таких навыков, как очистка данных, просмотр веб-страниц, автоматизация и масштабирование. Я также новичок в Python и буду писать статьи с точки зрения новичка, поэтому блог более удобен для новичков.

Если вы не разбираетесь в основах Python, вы можете сначала заглянуть в другой мой блог:Начните работу с Python за десять минут

100Участвовало несколько опытных разработчиков, которые получили почти1000КусокstarХотите узнать или принять участие в полнофункциональном полноплатформенном проекте с открытым исходным кодом ?
адрес проекта:GitHub.com/cache Cats/ из…

предисловие

Формат файла, который хранит данные таким образом, чтобы его было легко понять машине, часто называемый машиночитаемым. Общие машиночитаемые форматы включают:

  • Значения, разделенные запятыми (CSV)
  • Нотация объектов JavaScript (нотация объектов JavaScript, JSON)
  • Расширяемый язык разметки (eXtensible Markup Language, XML)

В устной и письменной речи эти форматы данных часто называются краткими именами (например, CSV). Мы будем использовать эти сокращения.

1. CSV-данные

Файл CSV (или сокращенно CSV) — это файл, в котором столбцы данных разделены запятыми. Расширение файла .csv.

Другой тип данных, называемый данными, разделенными табуляцией (TSV), иногда группируется с CSV. Единственная разница между TSV и CSV заключается в том, что разделителем между столбцами данных является табуляция, а не запятая. Расширение файла обычно .tsv, но иногда в качестве расширения используется .csv. По сути, файл .tsv делает в Python то же самое, что и файл .csv.

Мы используем источник данных от Всемирной организации здравоохранения (www.who.int/en/home) скачать…

Открыв официальный сайт ВОЗ, нажмите «Темы здравоохранения», «Данные и статистика», чтобы найти множество данных.

Статистические данные по уходу за младенцами и детьми ясельного возраста были загружены сюда и переименованы вdata.csv.

Файл csv можно открыть непосредственно в Excel, чтобы увидеть его интуитивно.Мы используем Excel, чтобы открыть следующий рисунок:

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

Чтение данных csv в виде списка

Напишите программу, которая читает файл csv:

import csv

csvfile = open('./data.csv', 'r')
reader = csv.reader(csvfile)

for row in reader:
    print(row)

import csvБудет импортирован модуль csv, который поставляется с Python.csvfile = open('./data.csv', 'r')Открыть файл данных как доступный только для чтения и сохранить в переменнойcsvfileсередина. Затем вызовите csvreader()метод сохранения вывода вreaderпеременная, а затем используйте цикл for для вывода данных.

Запускаем программу, вывод в консоль:

Вы можете видеть, что это соответствует содержимому, открытому в Excel.

Чтение данных csv в виде словаря

Измените код, чтобы читать csv как словарь

import csv

csvfile = open('./data.csv', 'r')
reader = csv.DictReader(csvfile)

for row in reader:
    print(row)

Вывод консоли:

2. Данные JSON

Также скачайте источник данных на официальном сайте ВОЗ и переименуйте его вdata.json. Открыть с помощью инструмента форматированияjsonФайлы следующие:

Напишите программу для парсинга json

import json

# 将 json 文件读取成字符串
json_data = open('./data.json').read()
# 对json数据解码
data = json.loads(json_data)
# data 的类型是 字典dict
print(type(data))
# 直接打印 data
print(data)
# 遍历字典
for k, v in data.items():
    print(k + ':' + str(v))

Вывод консоли:

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

  • json.dumps():Кодировать данные.
  • json.loads():Расшифруйте данные.

В процессе кодирования и декодирования json исходный тип python и тип json будут преобразованы друг в друга Конкретное сравнение преобразования выглядит следующим образом:

Кодировка Python в соответствующую таблицу преобразования типа JSON:

Python JSON
dict object
list, tuple array
str string
int, float, int- & float-derived Enums number
True true
False false
None null

JSON декодируется в таблицу соответствия преобразования типов Python:

JSON Python
object dict
array list
string str
number (int) int
number (real) float
true True
false False
null None

3. XML-данные

Данные в формате XML являются как машиночитаемыми, так и удобными для человека. Но для наборов данных в этой главе гораздо проще просмотреть и понять файлы CSV и JSON, чем файлы XML.

описание формата xml:

  • Tag: Части, заключенные в ;
  • Element: часть, окруженная тегом, например 2003, может рассматриваться как узел, у которого могут быть дочерние узлы;
  • Attribute: пары имя/значение, которые могут существовать в теге, такие как title="Enemy Behind" в примере, обычно представляют собой атрибуты.

Данные ВОЗ непросты для понимания, давайте воспользуемся простыми и понятными данными фильма, чтобы продемонстрировать:

<?xml version="1.0" encoding="UTF-8"?>
<collection shelf="New Arrivals">
    <movie title="Enemy Behind">
        <type>War, Thriller</type>
        <format>DVD</format>
        <year>2003</year>
        <rating>PG</rating>
        <stars>10</stars>
        <description>Talk about a US-Japan war</description>
    </movie>
    <movie title="Transformers">
        <type>Anime, Science Fiction</type>
        <format>DVD</format>
        <year>1989</year>
        <rating>R</rating>
        <stars>8</stars>
        <description>A schientific fiction</description>
    </movie>
    <movie title="Trigun">
        <type>Anime, Action</type>
        <format>DVD</format>
        <episodes>4</episodes>
        <rating>PG</rating>
        <stars>10</stars>
        <description>Vash the Stampede!</description>
    </movie>
    <movie title="Ishtar">
        <type>Comedy</type>
        <format>VHS</format>
        <rating>PG</rating>
        <stars>2</stars>
        <description>Viewable boredom</description>
    </movie>
</collection>

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

Следующий код написан для синтаксического анализа приведенного выше xml, а затем после синтаксического анализа форматируется в словарь и вывод данных в формате json:

from xml.etree import ElementTree as ET
import json

tree = ET.parse('./resource/movie.xml')
root = tree.getroot()

all_data = []

for movie in root:
    # 存储电影数据的字典
    movie_data = {}
    # 存储属性的字典
    attr_data = {}

    # 取出 type 标签的值
    movie_type = movie.find('type')
    attr_data['type'] = movie_type.text

    # 取出 format 标签的值
    movie_format = movie.find('format')
    attr_data['format'] = movie_format.text

    # 取出 year 标签的值
    movie_year = movie.find('year')
    if movie_year:
        attr_data['year'] = movie_year.text

    # 取出 rating 标签的值
    movie_rating = movie.find('rating')
    attr_data['rating'] = movie_rating.text

    # 取出 stars 标签的值
    movie_stars = movie.find('stars')
    attr_data['stars'] = movie_stars.text

    # 取出 description 标签的值
    movie_description = movie.find('description')
    attr_data['description'] = movie_description.text

    # 获取电影名字,以电影名为字典的键,属性信息为字典的值
    movie_title = movie.attrib.get('title')
    movie_data[movie_title] = attr_data
    # 存入列表中
    all_data.append(movie_data)

print(all_data)
# all_data 此时是一个列表对象,用 json.dumps() 将python对象转换为 json 字符串
json_str = json.dumps(all_data)
print(json_str)

Примечания написаны более подробно, следующим образомElementTreeпредоставленный метод.

3.1 Три метода разбора

ElementTreeЕсть три способа парсить xml:

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

    tree = ET.parse('./resource/movie.xml')
    root = tree.getroot()
    
  2. Вызов from_string(), который возвращает корневой элемент дерева синтаксического анализа.

    data = open('./resource/movie.xml').read()
    root = ET.fromstring(data)
    
  3. вызвать класс ElementTreeElementTree(self, element=None, file=None)метод

    tree = ET.ElementTree(file="./resource/movie.xml")
    root = tree.getroot() 
    

3.2 Элементные объекты

class xml.etree.ElementTree.Element(tag, attrib={}, **extra)

Свойства объектов Element

  • тег: тег
  • текст: удалить тег, получить содержимое тега.
  • attrib: Получить атрибут и значение атрибута в теге.
  • хвост: это свойство может использоваться для хранения дополнительных данных, связанных с элементом. Его значение обычно представляет собой строку, но может быть и объектом, зависящим от приложения.

Методы объектов-элементов

  1. clear(): очищает все дочерние элементы и все атрибуты, а для атрибутов текста и трейлера задает значение «Нет».

  2. get(attribute_name, default=None): получить значение атрибута, указав имя атрибута.

  3. items(): возвращает атрибуты элемента в виде пар ключ-значение.

  4. keys(): возвращает имена элементов в виде списка.

  5. set(attribute_name,attribute_value): установка атрибутов и значений атрибутов в теге.

  6. append(subelement): Добавляет дочерние элементы в конец внутреннего списка дочерних элементов.

  7. extend(subelements): добавить дочерние элементы.

  8. find(match, namespaces=None): найти первый совпавший дочерний элемент, совпадением может быть имя тега или путь. Возвращает экземпляр Element или None.

  9. findall(match, namespaces=None): находит все соответствующие дочерние элементы, возвращает список элементов.

  10. findtext(match, default=None, namespaces=None): найти текст, соответствующий первому дочернему элементу. Возвращает текстовое содержимое совпадающего элемента.

  11. getchildren(): используется после Python3.2list(elem)или итерация.

  12. getiterator(tag=None): используется после Python3.2Element.iter()

  13. iter(tag=None): Создает итератор дерева с корнем в текущем элементе. Итератор перебирает этот элемент и все элементы под ним (приоритет глубины). Если метка не равна None или '*', то из итератора будут возвращены только элементы с меткой, равной метке. Если древовидная структура изменяется во время итерации, результат не определен.

  14. iterfind(match, namespaces=None): Сопоставьте дочерние элементы, удовлетворяющие условию, и верните элемент.

3.3 Объекты ElementTree

class xml.etree.ElementTree.ElementTree(element=None, file=None)

ElementTree — это класс-оболочка, представляющий полную иерархию элементов и добавляющий некоторую дополнительную поддержку сериализации стандартного XML.

  1. setroot(element): заменить корневой элемент, содержимое исходного корневого элемента исчезнет.

  2. find(match, namespaces=None): сопоставление с корневым элементом аналогично Element.find().

  3. findall(match, namespaces=None): сопоставление с корневым элементом аналогично Element.findall().

  4. findtext(match, default=None, namespaces=None): сопоставление с корневым элементом аналогично Element.findtext().

  5. getiterator(tag=None): вместо Python 3.2 используйте ElementTree.iter().

  6. iter(tag=None): перебрать все элементы

  7. iterfind(match, namespaces=None): сопоставление с корневым элементом аналогично Element.iterfind().

  8. parse(source, parser=None): анализировать текст xml и возвращать корневой элемент.

  9. write(file, encoding=”us-ascii”, xml_declaration=None, default_namespace=None, method=”xml”, *, short_empty_elements=True): Запись XML-текста.

Обработка данных в форматах JSON, XML и CSV завершена.В следующем выпуске мы поговорим о том, как обрабатывать файлы Excel.Приглашаем обратить внимание.


Полный стек полноплатформенный проект с открытым исходным кодом CodeRiver

CodeRiver – это бесплатная платформа для совместной работы над проектами. Цель – открыть передовые и последующие этапы развития ИТ-индустрии.Являетесь ли вы менеджером по продукту, дизайнером, программистом, тестировщиком или другим отраслевым персоналом, если у вас есть хорошие идеи и идеи. , вы можете бесплатно зайти на CodeRiver. Публикуйте проекты и собирайте единомышленников, чтобы воплотить мечты в реальность!

Сам CodeRiver также является крупномасштабным проектом с открытым исходным кодом, посвященным созданию полнофункционального, полноплатформенного проекта с открытым исходным кодом корпоративного уровня. Охватывает практически все основные технологические стеки, такие как React, Vue, Angular, Mini Programs, ReactNative, Android, Flutter, Java, Node и т. д., уделяя особое внимание качеству кода.

Было почти100Участвовал ряд выдающихся разработчиков, и githubstarОколо1000Кусок. В каждом технологическом стеке есть несколько опытных боссов, а два архитектора руководят структурой проекта. Независимо от того, какой язык и уровень навыков вы хотите изучать, вы можете чему-то научиться здесь.

пройти через高质量源码 + 博客 + 视频, чтобы помочь каждому разработчику быстро расти.

адрес проекта:GitHub.com/cache Cats/ из…


Ваша поддержка - самая большая движущая сила для нас, чтобы двигаться вперед, добро пожаловать, чтобы поставить лайк, добро пожаловать, чтобы отправить маленькие звездочки ✨ ~