Update: An evloved version can be found here: https://github.com/miku/marcx
A slim layer on top of
pymarc.Record
,
that might save you a line.
-
Adding a control field (001-009):
# w/ Record field = pymarc.Field('001', data='12345') record.add_field(field) # w/ SlimRecord record.add('001', data='21345')
-
Adding a non-control field (010-999):
# w/ Record field = pymarc.Field('852', [' ',' '], subfields = ['a', 'DE-15']) record.add_field(field) # w/ SlimRecord, [' ',' '] are the default indicators record.add('852', a='DE-15')
-
Adding multiple subfields to a non-control field at once:
# w/ Record field = pymarc.Field('980', [' ',' '], subfields=['a', '12376']) record.add_field(field) field = pymarc.Field('980', [' ',' '], subfields=['b', '001']) record.add_field(field) # w/ SlimRecord record.add('980', a='12376', b='001')
-
Adding multiple subfields to a non-control field at once with different indicators:
# w/ Record field = pymarc.Field('041', ['0',' '], subfields=['a', 'ger']) record.add_field(field) field = pymarc.Field('041', ['0','7'], subfields=['a', 'dt.']) record.add_field(field) # w/ SlimRecord record.add('041', a='ger', indicators=['0',' ']) record.add('041', a='dt.', indicators=['0','7'])
-
Specify indicators as strings (since an indicator is just a single char):
# w/ SlimRecord record.add('041', a='ger', indicators='0 ') record.add('041', a='dt.', indicators='07')
-
Removing a field:
# w/ Record __001 = record['001'] record.remove_field(__001) # w/ SlimRecord record.remove('001') # removes all 001 fields
-
Example from pymarc.Field source:
# w/ Record field = Field( tag='245', indicators=['0', '1'], subfields=[ 'a', 'The pragmatic programmer : ', 'b', 'from journeyman to master /', 'c', 'Andrew Hunt, David Thomas.' ]) record.add_field(field) # w/ SlimRecord record.add('245', a='The pragmatic programmer : ', b='from journeyman to master /', c='Andrew Hunt, David Thomas.', indicators='01')
See also: 00X - Control Fields-General Information
>>> obj.add('001', a='Yeah')
...
ValueError: data must not be empty
>>> obj.add('010', data='Yeah')
...
ValueError: non-control fields take no data
>>> obj.add('001', data='...', indicators='00')
...
ValueError: control fields take no indicators
see: http://www.loc.gov/marc/bibliographic/bd00x.html
>>> obj.add('001', data='...', a='X')
...
ValueError: control fields take no subfields
see: http://www.loc.gov/marc/bibliographic/bd00x.html
- The binary serialization of
SlimRecord
andRecord
are equal modulo subfield ordering - that should be good enough for almost all cases. - Subfields that are not valid Python identifiers (e.g.
0
or9
) cannot be passed as keyword arguments.
Baseline (100%) is the pymarc.Record
, overhead is the runtime
of a SlimRecord
for the same task.
$ python slimrecord_bm.py
{
"add_4_subfields_slow": {
"Record": 27.525104999542236,
"about": "add four subfields (slow Record; one subfield at a time)",
"overhead": "49%",
"SlimRecord": 13.56899905204773
},
"add": {
"Record": 8.162935972213745,
"about": "add a single field",
"overhead": "153%",
"SlimRecord": 12.51692795753479
},
"empty": {
"Record": 1.3446869850158691,
"about": "constructor call",
"overhead": "99%",
"SlimRecord": 1.3404619693756104
},
"remove": {
"Record": 8.258254051208496,
"about": "remove a field",
"overhead": "149%",
"SlimRecord": 12.338546991348267
},
"add_3_subfields": {
"Record": 8.428110122680664,
"about": "add three subfields",
"overhead": "159%",
"SlimRecord": 13.46127700805664
},
"add_2_subfields_slow": {
"Record": 16.625359773635864,
"about": "add two subfields (slow Record; one subfield at a time)",
"overhead": "77%",
"SlimRecord": 12.948042869567871
},
"N": 1000000
}