从逗号分隔变量行构建字典

时间:2016-12-02 23:10:42

标签: python csv

我正在尝试解析文件。我有一个文件名kjv.tsv。在这个文件里面,每一行都包括书名,章节名,诗句号和诗句。

输出应如下所示:

(ge,   0,    0,    In the beginning God created the heaven and the earth.)
(ge,   0,    1,    And the earth was .... upon the face of the waters.)
(ge,   0,    2,    And God said, Let there be light: and there was light.)

这是我到目前为止所得到的。我的函数名是我正在定义parse_line的行:

def parse_line(line):
    '''
    Converts a line from kjv.tsv into a list of verse information. I.e.
    [book name, chapter number, verse number, verse text]
    Return a list of verse information
    '''
    bibletext = open("kjv.tsv" , "r").readlines()

    bible = {}
    for line in bibletext.splitlines():
        number, bv, contents = line.split(" | ")
        book, verse = bv.strip().split(" ")
        print (book)
        print (bible)
        if book in bible:
            bible[book].append([verse,contents])
        else:
            bible[book] = [verse,contents]

    print (bible)

1 个答案:

答案 0 :(得分:1)

这比在python中更容易。您可以使用for循环遍历文件中的每一行,并拆分前3个逗号。

bible = []

with open('kjv.tsv') as f:
    for line in f:
        bible.append(line.split(',', 3))

print(bible)

了解更多结帐: Information on why to use a with statement and looping through lines in a file with a for loophow split works
请注意,这不是这个问题标题的答案。上面的代码与您在问题正文中所说的相符。 您的问题正文要求构建一个列表,因此上面的代码构建了一个列表。为了构建字典,您需要确定您希望键和值的内容。您将使用密钥检索值。 你可以做的是用以下内容检索经文:

bible['John']['11']['35']
>>> 'Jesus wept'

只需将此代码添加到上面代码的末尾:

bible_dict = {}
for book, chapter, verse, text in bible:
    if not bible_dict.get(book):
        bible_dict[book] = {}
    if not bible_dict[book].get(chapter):
        bible_dict[book][chapter] = {}
    if not bible_dict[book][chapter].get(verse):
        bible_dict[book][chapter][verse] = text

上面的代码检查这本书是否在dict中。如果是,则检查章节是否在书中。如果是,那么它会检查这节经文是否在书中。如果这节经文不在书中,它会添加它。如果缺少任何项目(书籍,章节或诗歌),脚本将添加任何项目。它将对文件中的每一行执行此操作。

脚本的前半部分将文件转换为列表列表,每行都是书,章,诗和文本的列表。
脚本的后半部分将列表列表变成了一个词典,其中书是一个词典,每一章都是一个词典,每一节都是一个键,每个文本都是一个值。
如果您需要更多说明,请告诉我。