我有一个文本文件。该文件包含行。几行之后只有一个空白行。该行用于指示部分的结尾。 第一空白行用于指示主要文本的结尾和子文本的开头。如果检测到另一个空白行,则表示子文本部分已经完成,并且新的主要文本部分开始了。
我写了一些代码来解决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
更新: 我对代码做了一些更改。但是问题仍然存在。
答案 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
在您的代码中line
在while
循环内没有改变,这就是为什么它永远不会结束,您读的文件不会超过一行。
编辑:
这是您的代码(我尝试对其进行尽可能少的更改):
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之外。
希望,这会有所帮助!