pymarc


Namepymarc JSON
Version 5.1.2 PyPI version JSON
download
home_pagehttp://gitlab.com/pymarc/pymarc
SummaryRead, write and modify MARC bibliographic data
upload_time2024-02-12 14:42:58
maintainer
docs_urlNone
authorEd Summers
requires_python>=3.7
licensehttp://www.opensource.org/licenses/bsd-license.php
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            ```
_|_|_|    _|    _|  _|_|_|  _|_|      _|_|_|  _|  _|_|    _|_|_|
_|    _|  _|    _|  _|    _|    _|  _|    _|  _|_|      _|
_|    _|  _|    _|  _|    _|    _|  _|    _|  _|        _|
_|_|_|      _|_|_|  _|    _|    _|    _|_|_|  _|          _|_|_|
_|              _|
_|          _|_|
```

[![Build status](https://gitlab.com/pymarc/pymarc/badges/main/pipeline.svg)](https://gitlab.com/pymarc/pymarc/-/commits/main)

pymarc is a python library for working with bibliographic data encoded in
[MARC21](https://en.wikipedia.org/wiki/MARC_standards). It provides an API for
reading, writing and modifying MARC records. It was mostly designed to be an
emergency eject seat, for getting your data assets out of MARC and into some
kind of saner representation. However over the years it has been used to create
and modify MARC records, since despite [repeated
calls](https://web.archive.org/web/20170731163019/http://www.marc-must-die.info/index.php/Main_Page)
for it to die as a format, MARC seems to be living quite happily as a zombie.

Below are some common examples of how you might want to use pymarc. If
you run across an example that you think should be here please send a
pull request.

You can read pymarc documentation [here](https://pymarc.readthedocs.io/en/latest/).

### Installation

You'll probably just want to use pip to install pymarc:

    pip install pymarc

If you'd like to download and install the latest source you'll need git:

    git clone git://gitlab.com/pymarc/pymarc.git

You'll also need [setuptools](https://pypi.python.org/pypi/setuptools#installation-instructions). Once you have the source and setuptools run the pymarc test
suite to make sure things are in order with the distribution:

    python setup.py test

And then install:

    python setup.py install

### Reading

Most often you will have some MARC data and will want to extract data
from it. Here's an example of reading a batch of records and printing out
the title. If you are curious this example uses the batch file
available here in pymarc repository:

```python
from pymarc import MARCReader
with open('test/marc.dat', 'rb') as fh:
    reader = MARCReader(fh)
    for record in reader:
        print(record.title)
```
```
The pragmatic programmer : from journeyman to master /
Programming Python /
Learning Python /
Python cookbook /
Python programming for the absolute beginner /
Web programming : techniques for integrating Python, Linux, Apache, and MySQL /
Python programming on Win32 /
Python programming : an introduction to computer science /
Python Web programming /
Core python programming /
Python and Tkinter programming /
Game programming with Python, Lua, and Ruby /
Python programming patterns /
Python programming with the Java class libraries : a tutorial for building Web
and Enterprise applications /
Learn to program using Python : a tutorial for hobbyists, self-starters, and all
who want to learn the art of computer programming /
Programming with Python /
BSD Sockets programming from a multi-language perspective /
Design patterns : elements of reusable object-oriented software /
Introduction to algorithms /
ANSI Common Lisp /
```

A `pymarc.Record` object has a few handy properties like `title` for getting at
bits of a bibliographic record, others include: `author`, `isbn`, `subjects`,
`location`, `notes`, `physicaldescription`, `publisher`, `pubyear`, `issn`,
`issn_title`. But really, to work with MARC data you need to understand the
numeric field tags and subfield codes that are used to designate various bits
of information. There is a lot more data hidden in a MARC record than these
helper properties provide access to. For example the `title` property works by
extracting the information from the `245` field, subfields `a` and `b` behind
the scenes. You can access `245a` like so:

```python
print(record['245']['a'])
```

Some fields like subjects can repeat. In cases like that you will want to use
`get_fields` to get all of them as `pymarc.Field` objects, which you can then
interact with further:

```python
for f in record.get_fields('650'):
    print(f)
```

If you are new to MARC fields [Understanding
MARC](http://www.loc.gov/marc/umb/) is a pretty good primer, and the [MARC 21
Formats](http://www.loc.gov/marc/marcdocz.html) page at the Library of Congress 
is a good reference once you understand the basics.

### Writing

*Note: As of v5.0.0 `Subfield` is used to create subfields. Prior to v5,
subfields were constructed and accessed as a list of strings, e.g., `[code,
value, code, value]`. In v5.0.0 this has been changed to organize the subfields
into a list of tuples, e.g., `[(code, value), (code, value)]`. The `Subfield`
is implemented as a `NamedTuple` so that the tuples can be constructed as
`Subfield(code=code, value=value)`. The old style of creating subfields is no
longer supported. Attempting to pass a list of strings to the `subfields`
parameter for the `Field` constructor will raise a `ValueError`. For
convenience the `Field.convert_legacy_subfields` class method can be used to 
convert a legacy list of strings into a list of `Subfield`s.*

Here's an example of creating a record and writing it out to a file.

```python
from pymarc import Record, Field, Subfield

record = Record()
record.add_field(
    Field(
        tag='245',
        indicators=['0', '1'],
        subfields=[
            Subfield(code='a', value='The pragmatic programmer : '),
            Subfield(code='b', value='from journeyman to master /'),
            Subfield(code='c', value='Andrew Hunt, David Thomas.')
        ]))
with open('file.dat', 'wb') as out:
    out.write(record.as_marc())
```

To convert from the old string list to a list of `Subfield`s, the `.convert_legacy_subfields` class method
is provided on the `Field` class.

```python
from pymarc import Field, Subfield

legacy_fields: list[str] = ['a', 'The pragmatic programmer : ',
                            'b', 'from journeyman to master /',
                            'c', 'Andrew Hunt, David Thomas']

coded_fields: list[Subfield] = Field.convert_legacy_subfields(legacy_fields)
```

### Updating

Updating works the same way, you read it in, modify it, and then write it out
again:

```python
from pymarc import MARCReader
with open('test/marc.dat', 'rb') as fh:
    reader = MARCReader(fh)
    record = next(reader)
    record['245']['a'] = 'The Zombie Programmer : '
with open('file.dat', 'wb') as out:
    out.write(record.as_marc())
```


### JSON and XML

If you find yourself using MARC data a fair bit, and distributing it, you may
make other developers a bit happier by using the JSON or XML serializations. The
main benefit to using XML or JSON is that the UTF8 character encoding is used,
rather than the frustratingly archaic MARC8 encoding. Also they will be able to
use standard JSON and XML reading/writing tools to get at the data they want
instead of some crazy MARC processing library like, ahem, pymarc.

**XML**

To parse a file of MARCXML records you can:

```python

from pymarc import parse_xml_to_array

records = parse_xml_to_array('test/batch.xml')
```

If you have a large XML file and would rather not read them all into memory you
can:

```python

from pymarc import map_xml

def print_title(r):
    print(r.title)

map_xml(print_title, 'test/batch.xml')
```

Also, if you prefer you can pass in a file like object in addition to the path
to both *map_xml* and *parse_xml_to_array*:

```python
from pymarc import parse_xml_to_array

records = parse_xml_to_array(open('test/batch.xml'))
```

**JSON**

JSON support is fairly minimal in that you can call a `pymarc.Record`'s
`as_json()` method to return JSON for a given MARC Record:

```python
from pymarc import MARCReader

with open('test/one.dat','rb') as fh:
    reader = MARCReader(fh)
    for record in reader:
        print(record.as_json(indent=2))
```

```json
{
  "leader": "01060cam  22002894a 4500",
  "fields": [
    {
      "001": "11778504"
    },
    {
      "010": {
        "ind1": " ",
        "subfields": [
          {
            "a": "   99043581 "
          }
        ],
        "ind2": " "
      }
    },
    {
      "100": {
        "ind1": "1",
        "subfields": [
          {
            "a": "Hunt, Andrew,"
          },
          {
            "d": "1964-"
          }
        ],
        "ind2": " "
      }
    },
    {
      "245": {
        "ind1": "1",
        "subfields": [
          {
            "a": "The pragmatic programmer :"
          },
          {
            "b": "from journeyman to master /"
          },
          {
            "c": "Andrew Hunt, David Thomas."
          }
        ],
        "ind2": "4"
      }
    },
    {
      "260": {
        "ind1": " ",
        "subfields": [
          {
            "a": "Reading, Mass :"
          },
          {
            "b": "Addison-Wesley,"
          },
          {
            "c": "2000."
          }
        ],
        "ind2": " "
      }
    },
    {
      "300": {
        "ind1": " ",
        "subfields": [
          {
            "a": "xxiv, 321 p. ;"
          },
          {
            "c": "24 cm."
          }
        ],
        "ind2": " "
      }
    },
    {
      "504": {
        "ind1": " ",
        "subfields": [
          {
            "a": "Includes bibliographical references."
          }
        ],
        "ind2": " "
      }
    },
    {
      "650": {
        "ind1": " ",
        "subfields": [
          {
            "a": "Computer programming."
          }
        ],
        "ind2": "0"
      }
    },
    {
      "700": {
        "ind1": "1",
        "subfields": [
          {
            "a": "Thomas, David,"
          },
          {
            "d": "1956-"
          }
        ],
        "ind2": " "
      }
    }
  ]
}
```

If you want to parse a file of MARCJSON records you can:

```python
from pymarc import parse_json_to_array

records = parse_json_to_array(open('test/batch.json'))

print(records[0])
```

```
=LDR  00925njm  22002777a 4500
=001  5637241
=003  DLC
=005  19920826084036.0
=007  sdubumennmplu
=008  910926s1957\\\\nyuuun\\\\\\\\\\\\\\eng\\
=010  \\$a   91758335
=028  00$a1259$bAtlantic
=040  \\$aDLC$cDLC
=050  00$aAtlantic 1259
=245  04$aThe Great Ray Charles$h[sound recording].
=260  \\$aNew York, N.Y. :$bAtlantic,$c[1957?]
=300  \\$a1 sound disc :$banalog, 33 1/3 rpm ;$c12 in.
=511  0\$aRay Charles, piano & celeste.
=505  0\$aThe Ray -- My melancholy baby -- Black coffee -- There's no you -- Doodlin' -- Sweet sixteen bars -- I surrender dear -- Undecided.
=500  \\$aBrief record.
=650  \0$aJazz$y1951-1960.
=650  \0$aPiano with jazz ensemble.
=700  1\$aCharles, Ray,$d1930-$4prf
```

Support
-------

The pymarc developers encourage you to join the [pymarc Google
Group](http://groups.google.com/group/pymarc) if you need help.  Also, please
feel free to use [issue tracking](https://gitlab.com/pymarc/pymarc/issues) on
GitLab to submit feature requests or bug reports. If you've got an itch to
scratch, please scratch it, and send merge requests on
[GitLab](http://gitlab.com/pymarc/pymarc).

If you start working with MARC you may feel like you need moral support
in addition to technical support. The
[#code4lib](ircs://irc.libera.chat/code4lib) channel on [Libera](https://libera.chat/) is a good place for both.



            

Raw data

            {
    "_id": null,
    "home_page": "http://gitlab.com/pymarc/pymarc",
    "name": "pymarc",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": "",
    "keywords": "",
    "author": "Ed Summers",
    "author_email": "ehs@pobox.com",
    "download_url": "https://files.pythonhosted.org/packages/bd/15/5d9d80edb561bdcf31bf47771c03a461b6136162daada2083dcdb9d3890d/pymarc-5.1.2.tar.gz",
    "platform": null,
    "description": "```\n_|_|_|    _|    _|  _|_|_|  _|_|      _|_|_|  _|  _|_|    _|_|_|\n_|    _|  _|    _|  _|    _|    _|  _|    _|  _|_|      _|\n_|    _|  _|    _|  _|    _|    _|  _|    _|  _|        _|\n_|_|_|      _|_|_|  _|    _|    _|    _|_|_|  _|          _|_|_|\n_|              _|\n_|          _|_|\n```\n\n[![Build status](https://gitlab.com/pymarc/pymarc/badges/main/pipeline.svg)](https://gitlab.com/pymarc/pymarc/-/commits/main)\n\npymarc is a python library for working with bibliographic data encoded in\n[MARC21](https://en.wikipedia.org/wiki/MARC_standards). It provides an API for\nreading, writing and modifying MARC records. It was mostly designed to be an\nemergency eject seat, for getting your data assets out of MARC and into some\nkind of saner representation. However over the years it has been used to create\nand modify MARC records, since despite [repeated\ncalls](https://web.archive.org/web/20170731163019/http://www.marc-must-die.info/index.php/Main_Page)\nfor it to die as a format, MARC seems to be living quite happily as a zombie.\n\nBelow are some common examples of how you might want to use pymarc. If\nyou run across an example that you think should be here please send a\npull request.\n\nYou can read pymarc documentation [here](https://pymarc.readthedocs.io/en/latest/).\n\n### Installation\n\nYou'll probably just want to use pip to install pymarc:\n\n    pip install pymarc\n\nIf you'd like to download and install the latest source you'll need git:\n\n    git clone git://gitlab.com/pymarc/pymarc.git\n\nYou'll also need [setuptools](https://pypi.python.org/pypi/setuptools#installation-instructions). Once you have the source and setuptools run the pymarc test\nsuite to make sure things are in order with the distribution:\n\n    python setup.py test\n\nAnd then install:\n\n    python setup.py install\n\n### Reading\n\nMost often you will have some MARC data and will want to extract data\nfrom it. Here's an example of reading a batch of records and printing out\nthe title. If you are curious this example uses the batch file\navailable here in pymarc repository:\n\n```python\nfrom pymarc import MARCReader\nwith open('test/marc.dat', 'rb') as fh:\n    reader = MARCReader(fh)\n    for record in reader:\n        print(record.title)\n```\n```\nThe pragmatic programmer : from journeyman to master /\nProgramming Python /\nLearning Python /\nPython cookbook /\nPython programming for the absolute beginner /\nWeb programming : techniques for integrating Python, Linux, Apache, and MySQL /\nPython programming on Win32 /\nPython programming : an introduction to computer science /\nPython Web programming /\nCore python programming /\nPython and Tkinter programming /\nGame programming with Python, Lua, and Ruby /\nPython programming patterns /\nPython programming with the Java class libraries : a tutorial for building Web\nand Enterprise applications /\nLearn to program using Python : a tutorial for hobbyists, self-starters, and all\nwho want to learn the art of computer programming /\nProgramming with Python /\nBSD Sockets programming from a multi-language perspective /\nDesign patterns : elements of reusable object-oriented software /\nIntroduction to algorithms /\nANSI Common Lisp /\n```\n\nA `pymarc.Record` object has a few handy properties like `title` for getting at\nbits of a bibliographic record, others include: `author`, `isbn`, `subjects`,\n`location`, `notes`, `physicaldescription`, `publisher`, `pubyear`, `issn`,\n`issn_title`. But really, to work with MARC data you need to understand the\nnumeric field tags and subfield codes that are used to designate various bits\nof information. There is a lot more data hidden in a MARC record than these\nhelper properties provide access to. For example the `title` property works by\nextracting the information from the `245` field, subfields `a` and `b` behind\nthe scenes. You can access `245a` like so:\n\n```python\nprint(record['245']['a'])\n```\n\nSome fields like subjects can repeat. In cases like that you will want to use\n`get_fields` to get all of them as `pymarc.Field` objects, which you can then\ninteract with further:\n\n```python\nfor f in record.get_fields('650'):\n    print(f)\n```\n\nIf you are new to MARC fields [Understanding\nMARC](http://www.loc.gov/marc/umb/) is a pretty good primer, and the [MARC 21\nFormats](http://www.loc.gov/marc/marcdocz.html) page at the Library of Congress \nis a good reference once you understand the basics.\n\n### Writing\n\n*Note: As of v5.0.0 `Subfield` is used to create subfields. Prior to v5,\nsubfields were constructed and accessed as a list of strings, e.g., `[code,\nvalue, code, value]`. In v5.0.0 this has been changed to organize the subfields\ninto a list of tuples, e.g., `[(code, value), (code, value)]`. The `Subfield`\nis implemented as a `NamedTuple` so that the tuples can be constructed as\n`Subfield(code=code, value=value)`. The old style of creating subfields is no\nlonger supported. Attempting to pass a list of strings to the `subfields`\nparameter for the `Field` constructor will raise a `ValueError`. For\nconvenience the `Field.convert_legacy_subfields` class method can be used to \nconvert a legacy list of strings into a list of `Subfield`s.*\n\nHere's an example of creating a record and writing it out to a file.\n\n```python\nfrom pymarc import Record, Field, Subfield\n\nrecord = Record()\nrecord.add_field(\n    Field(\n        tag='245',\n        indicators=['0', '1'],\n        subfields=[\n            Subfield(code='a', value='The pragmatic programmer : '),\n            Subfield(code='b', value='from journeyman to master /'),\n            Subfield(code='c', value='Andrew Hunt, David Thomas.')\n        ]))\nwith open('file.dat', 'wb') as out:\n    out.write(record.as_marc())\n```\n\nTo convert from the old string list to a list of `Subfield`s, the `.convert_legacy_subfields` class method\nis provided on the `Field` class.\n\n```python\nfrom pymarc import Field, Subfield\n\nlegacy_fields: list[str] = ['a', 'The pragmatic programmer : ',\n                            'b', 'from journeyman to master /',\n                            'c', 'Andrew Hunt, David Thomas']\n\ncoded_fields: list[Subfield] = Field.convert_legacy_subfields(legacy_fields)\n```\n\n### Updating\n\nUpdating works the same way, you read it in, modify it, and then write it out\nagain:\n\n```python\nfrom pymarc import MARCReader\nwith open('test/marc.dat', 'rb') as fh:\n    reader = MARCReader(fh)\n    record = next(reader)\n    record['245']['a'] = 'The Zombie Programmer : '\nwith open('file.dat', 'wb') as out:\n    out.write(record.as_marc())\n```\n\n\n### JSON and XML\n\nIf you find yourself using MARC data a fair bit, and distributing it, you may\nmake other developers a bit happier by using the JSON or XML serializations. The\nmain benefit to using XML or JSON is that the UTF8 character encoding is used,\nrather than the frustratingly archaic MARC8 encoding. Also they will be able to\nuse standard JSON and XML reading/writing tools to get at the data they want\ninstead of some crazy MARC processing library like, ahem, pymarc.\n\n**XML**\n\nTo parse a file of MARCXML records you can:\n\n```python\n\nfrom pymarc import parse_xml_to_array\n\nrecords = parse_xml_to_array('test/batch.xml')\n```\n\nIf you have a large XML file and would rather not read them all into memory you\ncan:\n\n```python\n\nfrom pymarc import map_xml\n\ndef print_title(r):\n    print(r.title)\n\nmap_xml(print_title, 'test/batch.xml')\n```\n\nAlso, if you prefer you can pass in a file like object in addition to the path\nto both *map_xml* and *parse_xml_to_array*:\n\n```python\nfrom pymarc import parse_xml_to_array\n\nrecords = parse_xml_to_array(open('test/batch.xml'))\n```\n\n**JSON**\n\nJSON support is fairly minimal in that you can call a `pymarc.Record`'s\n`as_json()` method to return JSON for a given MARC Record:\n\n```python\nfrom pymarc import MARCReader\n\nwith open('test/one.dat','rb') as fh:\n    reader = MARCReader(fh)\n    for record in reader:\n        print(record.as_json(indent=2))\n```\n\n```json\n{\n  \"leader\": \"01060cam  22002894a 4500\",\n  \"fields\": [\n    {\n      \"001\": \"11778504\"\n    },\n    {\n      \"010\": {\n        \"ind1\": \" \",\n        \"subfields\": [\n          {\n            \"a\": \"   99043581 \"\n          }\n        ],\n        \"ind2\": \" \"\n      }\n    },\n    {\n      \"100\": {\n        \"ind1\": \"1\",\n        \"subfields\": [\n          {\n            \"a\": \"Hunt, Andrew,\"\n          },\n          {\n            \"d\": \"1964-\"\n          }\n        ],\n        \"ind2\": \" \"\n      }\n    },\n    {\n      \"245\": {\n        \"ind1\": \"1\",\n        \"subfields\": [\n          {\n            \"a\": \"The pragmatic programmer :\"\n          },\n          {\n            \"b\": \"from journeyman to master /\"\n          },\n          {\n            \"c\": \"Andrew Hunt, David Thomas.\"\n          }\n        ],\n        \"ind2\": \"4\"\n      }\n    },\n    {\n      \"260\": {\n        \"ind1\": \" \",\n        \"subfields\": [\n          {\n            \"a\": \"Reading, Mass :\"\n          },\n          {\n            \"b\": \"Addison-Wesley,\"\n          },\n          {\n            \"c\": \"2000.\"\n          }\n        ],\n        \"ind2\": \" \"\n      }\n    },\n    {\n      \"300\": {\n        \"ind1\": \" \",\n        \"subfields\": [\n          {\n            \"a\": \"xxiv, 321 p. ;\"\n          },\n          {\n            \"c\": \"24 cm.\"\n          }\n        ],\n        \"ind2\": \" \"\n      }\n    },\n    {\n      \"504\": {\n        \"ind1\": \" \",\n        \"subfields\": [\n          {\n            \"a\": \"Includes bibliographical references.\"\n          }\n        ],\n        \"ind2\": \" \"\n      }\n    },\n    {\n      \"650\": {\n        \"ind1\": \" \",\n        \"subfields\": [\n          {\n            \"a\": \"Computer programming.\"\n          }\n        ],\n        \"ind2\": \"0\"\n      }\n    },\n    {\n      \"700\": {\n        \"ind1\": \"1\",\n        \"subfields\": [\n          {\n            \"a\": \"Thomas, David,\"\n          },\n          {\n            \"d\": \"1956-\"\n          }\n        ],\n        \"ind2\": \" \"\n      }\n    }\n  ]\n}\n```\n\nIf you want to parse a file of MARCJSON records you can:\n\n```python\nfrom pymarc import parse_json_to_array\n\nrecords = parse_json_to_array(open('test/batch.json'))\n\nprint(records[0])\n```\n\n```\n=LDR  00925njm  22002777a 4500\n=001  5637241\n=003  DLC\n=005  19920826084036.0\n=007  sdubumennmplu\n=008  910926s1957\\\\\\\\nyuuun\\\\\\\\\\\\\\\\\\\\\\\\\\\\eng\\\\\n=010  \\\\$a   91758335\n=028  00$a1259$bAtlantic\n=040  \\\\$aDLC$cDLC\n=050  00$aAtlantic 1259\n=245  04$aThe Great Ray Charles$h[sound recording].\n=260  \\\\$aNew York, N.Y. :$bAtlantic,$c[1957?]\n=300  \\\\$a1 sound disc :$banalog, 33 1/3 rpm ;$c12 in.\n=511  0\\$aRay Charles, piano & celeste.\n=505  0\\$aThe Ray -- My melancholy baby -- Black coffee -- There's no you -- Doodlin' -- Sweet sixteen bars -- I surrender dear -- Undecided.\n=500  \\\\$aBrief record.\n=650  \\0$aJazz$y1951-1960.\n=650  \\0$aPiano with jazz ensemble.\n=700  1\\$aCharles, Ray,$d1930-$4prf\n```\n\nSupport\n-------\n\nThe pymarc developers encourage you to join the [pymarc Google\nGroup](http://groups.google.com/group/pymarc) if you need help.  Also, please\nfeel free to use [issue tracking](https://gitlab.com/pymarc/pymarc/issues) on\nGitLab to submit feature requests or bug reports. If you've got an itch to\nscratch, please scratch it, and send merge requests on\n[GitLab](http://gitlab.com/pymarc/pymarc).\n\nIf you start working with MARC you may feel like you need moral support\nin addition to technical support. The\n[#code4lib](ircs://irc.libera.chat/code4lib) channel on [Libera](https://libera.chat/) is a good place for both.\n\n\n",
    "bugtrack_url": null,
    "license": "http://www.opensource.org/licenses/bsd-license.php",
    "summary": "Read, write and modify MARC bibliographic data",
    "version": "5.1.2",
    "project_urls": {
        "Homepage": "http://gitlab.com/pymarc/pymarc"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2c5964acb30560fa6326409e2d6db7ed9eb6e8b75419e1c24dd6e3700b97e69c",
                "md5": "bfd1132d1e93239262b2cbe04a5c668a",
                "sha256": "719340150adb600e0a3603e8504bc5b3d2f3e134dd73891e4d927b6f6731bb7d"
            },
            "downloads": -1,
            "filename": "pymarc-5.1.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "bfd1132d1e93239262b2cbe04a5c668a",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.7",
            "size": 157386,
            "upload_time": "2024-02-12T14:43:22",
            "upload_time_iso_8601": "2024-02-12T14:43:22.923732Z",
            "url": "https://files.pythonhosted.org/packages/2c/59/64acb30560fa6326409e2d6db7ed9eb6e8b75419e1c24dd6e3700b97e69c/pymarc-5.1.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "bd155d9d80edb561bdcf31bf47771c03a461b6136162daada2083dcdb9d3890d",
                "md5": "f6519f2baacf233866158a0d8b27f7bb",
                "sha256": "81ce6bfe9b47170f03d8a99209e4211778ade015a67b1eeb6b30862d4e24ae58"
            },
            "downloads": -1,
            "filename": "pymarc-5.1.2.tar.gz",
            "has_sig": false,
            "md5_digest": "f6519f2baacf233866158a0d8b27f7bb",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 234768,
            "upload_time": "2024-02-12T14:42:58",
            "upload_time_iso_8601": "2024-02-12T14:42:58.057401Z",
            "url": "https://files.pythonhosted.org/packages/bd/15/5d9d80edb561bdcf31bf47771c03a461b6136162daada2083dcdb9d3890d/pymarc-5.1.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-02-12 14:42:58",
    "github": false,
    "gitlab": true,
    "bitbucket": false,
    "codeberg": false,
    "gitlab_user": "pymarc",
    "gitlab_project": "pymarc",
    "lcname": "pymarc"
}
        
Elapsed time: 0.28344s