如何在Python中获得line->

时间:2012-09-01 19:22:03

标签: python iteration

我正在逐行遍历员工记录文件,并尝试在员工记录末尾插入一个新行(工作班次记录)到文件中,该记录标有“? ”

基本上我的文件看起来像这样:

  工作人员#####!
乔史密斯员工
第一班轮第二班轮?¥!
。简·史密斯偶然的志愿者
     

第一班次第二班次第三班次<?> @

......我想,比如说,给Jane Smith的记录添加一个“第四班”。我想通过迭代文件的工作副本,找到jane的记录(使用标志)然后当前行的后继(line-&gt; next ??)是“?”来做到这一点。我知道我现在的路线是Jane最后记录的班次。然后,我可以在“第四班”行中写入,然后继续将旧文件的剩余部分复制到我的新文件中。

当我迭代所有这些行时,如何阅读跟随行(检查“?”)而不实际跳过它?

1 个答案:

答案 0 :(得分:1)

无论如何,你基本上不能只在文件中间插入一行。相反,您应该使用包含新行的新文件覆盖旧文件。所以解决方案是这样的:

  1. 打开文件进行阅读。
  2. 保存文件的内容,最好逐行保存,以便更容易插入特定的行。
  3. 将新行插入已保存的内容。
  4. 重新打开文件,这次是在写入模式下,并使用保存的修改内容覆盖其内容。
  5. 因此,对于您的示例,并使用您的标记想法来查找插入点,您将执行以下操作:

    #Step 1
    with open('testFile', 'r') as f:
        #Step 2
        contentList = f.readlines()
    
    #Step 3
    isJane = False # <-- flag
    i = 0
    insertIndex = None # used to avoid changing the list while looping over it
    for line in contentList:
        if 'jane' in line.lower():
            isJane = True
        if isJane and line.strip() == '?':
            insertIndex = i
        i += 1
    contentList.insert(insertIndex, 'fourth shift\n')
    
    #Step 4
    with open('testFile', 'w') as f:
        f.writelines(contentList)
    

    有更短的方法可以做到这一点,但这可能是最直接的。