如何在Python中的for循环第二行中遍历文本文件?

时间:2018-11-03 16:39:56

标签: python file text

def main():

    text = open("unformated.txt", "r").readlines()
    infile = open("formated", "w")   

    title = ""


    for k, line in enumerate(text):     


        if (k == 0):                        
            for i in text[0].split():       
                i = i.lower()               
                title += i.capitalize() + " "   
            title = title + text[1][find("Prudence") : find("Prudence") + len("Prudence")] 
            infile.write(title.center(100, " ")

        if (k == 1)                         
            text[1].replace("Prudence ", "")
            infile.write(text[1])                
            infile.write("\n")              


        if (k > 1)                          
            words_in_list = ""                              
            for j in line.split():          
                words_in_list += j + " "    
            infile.write(words_in_list)                     
            infile.write("\n")              

    infile.close()
main()

enter image description here 非格式化版本

enter image description here 格式化版本

因此,第一张图片显示了非格式化文本的外观。第二个显示格式化的文本在通过python代码运行时的外观。

  1. 我不知道如何使用for k, enumerated(text:循环从第二行(行)开始

  2. title可以以某种方式在for循环之外进行处理。标题的问题是如何从第二行中提取字符串"Prudence"并将其附加到第一行的标题中。然后,在循环中,使用大写字母"by"将字符串"B"(第二行)制成第二行的字符串开头。

  3. 我不知道如何缩进段落,我只对rjust()知道,但是如何知道哪一行将成为该段落,也就是说,在哪一行之后(以及如何) 新队。由于某些原因,infile.write("\n")无法正常工作?

  4. 考虑到我是本课程的初学者,我们不应该使用if / else语句(即使我在这里使用了它们,但我对其他解决方案没有其他想法)和其他控制结构

执行以下代码行:

text = open("unformated.txt","r").readlines()

变量text中到底有什么?

2 个答案:

答案 0 :(得分:0)

.readlines()的文档中,本质上是读取文件中的所有行并返回所有行的列表。

还请注意,您可以for line in text遍历各行,并且由于text是可迭代的,因此您也可以枚举它。为了跳过第一行,只需使用.next(),它也返回该行,这样您可以存储和/或在使用.next的同时写它,然后循环遍历它们。

这样,对于您给出的示例,想要得到的结果我想说您不需要所有这些代码(也不需要readlines()enumerate())来获取您正在寻找的结果。我说您可以使用仅将段落结尾确定为以句点结尾和回车的行的方式。 (即'.\n

unformatted = open("unformated.txt", "r")
formatted = open("formated", "w")

    #use .next() to get the next line. .next for the first time returns the first line
formatted.write(unformatted.next().title().center(100)

    #then the rest just split paragraphs as I described above
for line in unformatted:
    if line.endswith('.\n')
        formatted.write('{}\n}'.format(line))
    elif line.startswith('Prudence'):
        formatted.write('\t{}\n'.format(unformatted.next()))
    else:
        formatted.write(line.replace('\t', ''))

这应该让您获得理想的结果,只需记住我识别段落的方式即可。

编辑-上面包含if语句

从技术上讲,您可以假设前两行是标题行。并为他们使用字典映射器。这将需要enumerate()

def make_title(t):
    return t.title().center(100)

def make_subtitle(t):
    return '\t' + t

def other_lines(t):
   return x.replace('.\n', ',\n\n')

special_lines = {
    0: make_title,
    1: make_subtitle
}

for n, line in enumerate(unformatted):
    formatted.write(special_lines.get(n, other_lines))(line)

请有人检查我的工作。我不在计算机上进行测试,但我认为这符合他的约束的正确思路,我知道我可以使用lambda来实现功能,但我不想过度使用它。

答案 1 :(得分:0)

text = open(“ unformated.txt”,“ r”)。readlines()将文件内容存储在列表中。

在k行中的

,在enumerate(text)中一行:它逐行遍历文本。 现在,如果您需要从第二行开始循环,可以尝试如下操作:

对于k,行以枚举(文本[2:]):

如果您还想循环阅读,也可以这样写:

对于k,行中的枚举(text [2:],2):
这样,k的值将从2开始,循环也从第二行开始。

我希望我能正确理解问题。