Trình phân tích cú pháp bibtex trong python

Hiện tại, pybtex không có nhiều tài liệu. Nguồn tài liệu đầu tiên, ngoài mã nguồn, là trang chủ của pybtex và đặc biệt là The Friendly Manual of Pybtex

Tôi không đủ giỏi về Python để trích xuất từ ​​mã nguồn của pybtex tất cả kiến ​​thức cần thiết để viết các tập lệnh dựa trên pybtex. Nhưng tôi đã xem mã nguồn, tôi đã thực hiện một số thử nghiệm và trang này là bản tóm tắt những gì tôi hiểu về cách sử dụng pybtex. Tất nhiên, phần lớn trang này đến từ sự phỏng đoán, vì vậy tôi có thể hoàn toàn sai về một số điều

Để nhận xét hoặc chỉnh sửa, hãy xem danh bạ của tôi trên trang chủ của tôi

Kiểu dữ liệu mục nhập thư mục

Đây là kiểu dữ liệu mục nhập thư mục pybtex trông như thế nào (phần thụt lề là của tôi)

BibliographyData
(entries=OrderedCaseInsensitiveDict
  ({
        'adams93':  Entry  (
            'article',
            fields={
                'volume': '4',
                'title': 'The title of the work',
                'journal': 'The name of the journal',
                'number': '2',
                'month': '7',
                'note': 'An optional note',
                'year': '1993',
                'pages': '201-213'},
            persons={
                'author': [Person(u'Adams, Peter')]}
          )
    
  }), preamble=[]

)

phân tích tệp

Đây là cách bạn khởi tạo trình phân tích cú pháp

    from pybtex.database.input import bibtex
    parser = bibtex.Parser()
    bib_data = parser.parse_file('myfile.bibtex')

Tại thời điểm này,

    from pybtex.database.input import bibtex
    parser = bibtex.Parser()
    bib_data = parser.parse_file('myfile.bibtex')
9 là một đối tượng bao gồm toàn bộ thư mục

bib_data. mục

Tôi tin rằng

for e in bib_data.entries:
	    print(bib_data.entries[e])
0 là một tuple có thể lặp lại (nhưng tôi không chắc lắm). Điều tôi chắc chắn là nó có thể lặp lại

Đoạn mã sau

for e in bib_data.entries:
	    print(bib_data.entries[e])

in từng mục (không được định dạng)

bib_data. mục [e]

Đến lượt mình, mỗi phần tử của vòng lặp

for e in bib_data.entries:
	    print(bib_data.entries[e])
1 trước đó là một từ điển

bib_data.entries[e]

ở đâu

for e in bib_data.entries:
	    print(bib_data.entries[e])
2là khóa bibtex (e. g.
for e in bib_data.entries:
	    print(bib_data.entries[e])
3), trong khi
for e in bib_data.entries:
	    print(bib_data.entries[e])
4 là một đối tượng 'mục nhập', thì đó có thể là một bộ (xét theo dấu ngoặc tròn trong phần tử 'Mục nhập' ở trên)

Nhưng thành thật mà nói, tôi không hiểu bộ dữ liệu

for e in bib_data.entries:
	    print(bib_data.entries[e])
4 này hoạt động như thế nào. Trên thực tế, mã
for e in bib_data.entries:
	    print(bib_data.entries[e])
6 không hoạt động. Nó làm tăng lỗi
for e in bib_data.entries:
	    print(bib_data.entries[e])
7. Tuy nhiên, đối tượng 'Entry' này có một số thuộc tính, được mô tả bên dưới

Một số thuộc tính của đối tượng 'Entry'

bib_data. mục [e]. loại

Đó là loại mục nhập (điện tử, sách, bài báo, bộ sưu tập)

bib_data. mục [e]. lĩnh vực

Đó là một từ điển bao gồm tất cả các lĩnh vực ngoại trừ 'tác giả' hoặc 'biên tập viên'. Pybtex quản lý nội dung của trường 'tác giả' hoặc 'biên tập viên' không phải dưới dạng chuỗi, mà dưới dạng danh sách các đối tượng 'Người'

Ngoài ra, loại mục nhập (sách, bài báo, v.v. ) không có trong từ điển

for e in bib_data.entries:
	    print(bib_data.entries[e])
8

Các khóa của từ điển

for e in bib_data.entries:
	    print(bib_data.entries[e])
8 là
bib_data.entries[e]
0,
bib_data.entries[e]
1 (không phân biệt chữ hoa chữ thường), v.v.

bib_data.entries[e]
2 mang lại kết quả giống như '1993' (một chuỗi)

bib_data. mục [e]. người

Đó là một đối tượng thuộc loại

bib_data.entries[e]
3, tôi. e. một loại từ điển cụ thể

  • có chìa khóa (có vẻ như) là
    bib_data.entries[e]
    4 hoặc
    bib_data.entries[e]
    5, trong khi
  • các giá trị của yes này là danh sách các đối tượng 'Person()'. Đến lượt mình, mỗi đối tượng 'Person()' bao gồm một chuỗi Unicode

Về cơ bản,

bib_data.entries[e]
6 là một từ điển, vì vậy

print(bib_data.entries[e].persons[u'Editor'])

mang lại một cái gì đó như

[Person(u'Trevisan, M.'), Person(u'Gigliozzi, G.')]

Tuy nhiên, nó tạo ra một

bib_data.entries[e]
7 nếu mục nhập thư mục không bao gồm một trường
bib_data.entries[e]
4 nhưng, ví dụ, một trường
bib_data.entries[e]
5 (hoặc không phải là
bib_data.entries[e]
4 hoặc
print(bib_data.entries[e].persons[u'Editor'])
1')

bib_data. mục [e]. người['editor']. đầu tiên()

Đó là một danh sách với một phần tử cho mỗi tên của tác giả/biên tập viên. Nếu chỉ có một tác giả/biên tập viên, nó vẫn là một danh sách, chỉ bao gồm một yếu tố

Tôi không chắc pybtex làm gì khi có nhiều tên (e. g. George Walker Bush) hoặc nhiều họ. Tôi biết chắc chắn pybtex xem xét các trường hợp như "C. M. " (không có khoảng cách ở giữa) hoặc "Jean-Daniel" (dấu gạch ngang ở giữa, không có khoảng trắng ở giữa) một chuỗi Unicode ("Jean-Daniel" không được chia thành "Jean" và "Daniel)

Đoạn mã sau mang lại danh sách với các phần khác của tên

bib_data.entries[e].persons['editor'].middle()
bib_data.entries[e].persons['editor'].last()
bib_data.entries[e].persons['editor'].von()
bib_data.entries[e].persons['editor'].junior()

Vì các đoạn mã đã nói ở trên trả về danh sách (không phải chuỗi), nếu bạn muốn in tên, bạn cần sử dụng

print(bib_data.entries[e].persons[u'Editor'])
2, như thế này

    from pybtex.database.input import bibtex
    parser = bibtex.Parser()
    bib_data = parser.parse_file('myfile.bibtex')
0

Nếu bạn muốn tìm kiếm giữa các tên thì sao?

    from pybtex.database.input import bibtex
    parser = bibtex.Parser()
    bib_data = parser.parse_file('myfile.bibtex')
1

khớp với 'Monella' nếu 'Monella' là cả họ, nhưng

    from pybtex.database.input import bibtex
    parser = bibtex.Parser()
    bib_data = parser.parse_file('myfile.bibtex')
2

không khớp với 'Monella'. Trong trường hợp này, bạn phải sử dụng

    from pybtex.database.input import bibtex
    parser = bibtex.Parser()
    bib_data = parser.parse_file('myfile.bibtex')
3

phù hợp với cả 'Monella' và 'Stella'

bib_data. mục [e]. mặt hàng

Tôi tin (mặc dù tôi không chắc lắm) rằng đó là một bộ, trong đó

print(bib_data.entries[e].persons[u'Editor'])
3là khóa bibtex (e. g.
for e in bib_data.entries:
	    print(bib_data.entries[e])
3. Như chúng ta đã thấy ở trên, bạn cũng có thể lấy khóa đó bằng.
    from pybtex.database.input import bibtex
    parser = bibtex.Parser()
    bib_data = parser.parse_file('myfile.bibtex')
4Vòng lặp 'for' này sẽ in danh sách tất cả các khóa bibtex trong thư mục.
print(bib_data.entries[e].persons[u'Editor'])
5là toàn bộ đối tượng 'Mục nhập' (xem ở trên), đến lượt nó bao gồm ba đối tượng
  • loại mục nhập (điện tử, sách, bài báo, v.v. )
  • nhữn cánh đồng
  • những người

Từ các thí nghiệm của tôi, có vẻ như không có

print(bib_data.entries[e].persons[u'Editor'])
6

Hai đoạn mã sau trả về chính xác cùng một đầu ra (đó là danh sách các mục được phân tách bằng các dòng trống và các dòng có '---')