如何转换包含主文本和多个子文本的字典

时间:2019-05-20 16:50:40

标签: python python-3.x file

我有一个文本文件。该文件包含行。几行之后只有一个空白行。该行用于指示部分的结尾。 第一空白行用于指示主要文本的结尾和子文本的开头。如果检测到另一个空白行,则表示子文本部分已经完成,并且新的主要文本部分开始了。

我写了一些代码来解决python中的这个问题。主要文本充当python词典中的键,而子文本充当该键的值。多个子文本存储为列表。

在代码中,变量如下:

 word  : Empty dictionary
 value : List  containing the sub headings
 key   : Contains the current main heading
 i     : set to 1 at the start to get the first line, when a 
         new line is detected, it changes to -1. When another 
         empty line is detected, it changes to 1 again.

这里1表示行包含主文本,而-1表示子文本。

如果i为1,则将主文本添加到密钥中。 如果为-1,则将子文本添加到值列表中。

如果我们检测到另一个空行,则检查i是否为-1,如果为true,则设置为{key:value}更新单词字典。

然后我们再次更改i的符号。

我的问题是程序似乎处于无限循环中。

非常感谢您阅读我的问题。任何帮助将不胜感激。

import json

class test1:

    word = {}
    value = []
    i = 1
    key = ''
    filepath = 'we.txt'
    with open(filepath) as fp:
            lines = fp.readlines()
            for j in range(0, len(lines)):
                    currentline = lines[j]
                    if i == 1:
                            key = currentline

                    if currentline in ['\n', '\r\n']:
                            if i == -1:
                                    word.update({key: value})

                    i = i * -1

                    if i == -1:
                            value.append(currentline)
            print(word)

输出应为

mainText11:['subtext1','subtext2']    maintext2:['subtext1','subtext2','subtext3']

we.txt包含以下内容:

                  main heading1

                  sub heading1
                  sub heading2

                  main heading2

更新: 我对代码做了一些更改。但是问题仍然存在。

1 个答案:

答案 0 :(得分:0)

要遍历文件的各行,这是我要做的:

with open(filepath) as fp:
    lines = fp.readlines() # read all the lines from the file
    for line in lines: # loop over the list containing all lines
        # same as in your while loop

在您的代码中linewhile循环内没有改变,这就是为什么它永远不会结束,您读的文件不会超过一行。


编辑:

这是您的代码(我尝试对其进行尽可能少的更改):

word = {}
value = []
i = 1
key = ''
filepath = 'we.txt'
with open(filepath) as fp:
        lines = fp.readlines()
        for j in range(0, len(lines)):
                currentline = lines[j]

                if currentline in ['\n', '\r\n']:
                        if i == -1:
                                word.update({key: value})
                                value = [] # start with empty value for the next key
                        i = i * -1 # switch only if we read a newline
                        continue # skip to next line (the newline shouldn't be stored)

                # store values only after we know, it's not an empty line
                if i == 1:
                        key = currentline()
                if i == -1:
                        value.append(currentline)

        word.update({key: value}) # update also with the last values
        print(word)

这些值的末尾会有换行符。为了摆脱这些,我很可能会在循环的第一行中找到

                currentline = lines[j].strip() # strip line, so it doesn't end with '\n'
                if not currentline: # if currentline is empty

此外,您可以将整个循环移到with之外。

希望,这会有所帮助!