在使用python写入文件之前,如何将文件指针对齐一行?

在使用python写入文件之前,如何将文件指针对齐一行?,python,file,file-pointer,Python,File,File Pointer,情景 有一个文件的末尾包含两个空行。当我在文件中附加某些内容时,它会在两行空白后写入(这是肯定的) 但我只需要一个空行,并删除第二个空行。应写入附加数据,以代替第二个空行 #-------Original file This is line 1 This is line 2 [--blank line--] This is line 3 This is line 4 [--blank line--] [--blank line--] 在上述文件中添加“这是第5行”和“这是第6行” 现在发

情景

有一个文件的末尾包含两个空行。当我在文件中附加某些内容时,它会在两行空白后写入(这是肯定的)

但我只需要一个空行,并删除第二个空行。应写入附加数据,以代替第二个空行

#-------Original file 
This is line 1 
This is line 2
[--blank line--] 
This is line 3
This is line 4
[--blank line--]
[--blank line--]
在上述文件中添加“这是第5行”和“这是第6行”

现在发生了什么事

我想要什么

我已经研究并得出了移动文件指针的解决方案。将内容追加到文件中时,文件指针可能位于第二个空行之后。 如果我将文件指针向上移动一行,然后附加“这是第5行”和“这是第6行”,是否有效

如果是,请帮助我如何做到这一点。 Seek()函数似乎不是很有用

除seek()之外的任何想法也将受到赞赏


非常感谢您的帮助。

这里有一种简单的方法,可以逐行读取文件,然后将指针恢复到最后一行之后的位置:

with open('fname', 'rw') as f:
    prev = pos = 0
    while f.readline():
        prev, pos = pos, f.tell()
    f.seek(prev)
    # Use f

如果您不想花时间阅读该文件,则需要决定(例如)要支持哪些行尾,而Python将在此处为您提供支持。

[这是根据适当场景的解决方案,仅适用于'\n'情况]

让我感谢@otus。他的回答+一些修改解决了我的问题

根据我希望开始添加新行的场景,默认情况下,文件指针位于末尾

#-------Original file 
This is line 1 
This is line 2
[--blank line--] 
This is line 3
This is line 4
[--blank line--]
[--blank line--]
* <-----------------------file pointer is here. 
现在我通常可以继续写像file1.write(“这是第5行”)之类的东西了


感谢otus和Janne(特别是缓冲区问题)

请显示您的代码。如果您已经在逐行读取文件,则可以在每次读取之前缓存FP位置。目前还没有代码,但它将是一个使用追加模式打开的简单文件,然后在其中写入这两行。你能告诉我一些关于把文件指针向上移动一行的事情吗。这个想法在我脑海里很清楚。我只是想知道如何将移位文件指针向上移动一行。一旦完成,指针将在第二个空白行开始,当我将追加某物时,空白行将消失,“这是第5行”将被添加到那里。@ OTU:简单查找(0)函数将指针移到文件的起始处。我能做些什么只将文件指针移到上面一行吗?修改文本文件的通常方法是重写整个文件。这不起作用,因为f中的行的
使用了预读缓冲区。@JanneKarila:Oops,在我的测试中意外地工作了,真是倒霉。修好了,我去看看这个。谢谢@otus。谢谢你的帮助。@otus-嘿,我做了一些修改就解决了这个问题。非常感谢你。你告诉我了。我将发布我的答案:)正如我在回答中所暗示的,您的解决方案将只适用于长度为1的EOL标记,即
“\n”
。Windows“
”\r\n“
将被损坏。我认为这可以追溯到一个字符,而不是一行。我想你的文件使用一个字符来终止行,而你的最后一行恰好是空的,但这通常不是一个好的解决方案。是的,奥特斯说的。安德鲁-你完全正确。就我而言,我有两个空行。所以如果我做pos=pos-1,它直接带我到上面的line.otus-是的,你是对的。但我已经根据场景设计了代码,它满足了目前的需求。干杯:)有一个额外的空行被不必要地创建了(我不知道为什么),我已经检查了这段代码。工作正常。
with open('fname', 'rw') as f:
    prev = pos = 0
    while f.readline():
        prev, pos = pos, f.tell()
    f.seek(prev)
    # Use f
#-------Original file 
This is line 1 
This is line 2
[--blank line--] 
This is line 3
This is line 4
[--blank line--]
[--blank line--]
* <-----------------------file pointer is here. 
 pos = file1.tell() #gives me current pointer
 pos =  pos - 1     #This will give above value, where second blank line resides
 file1.seek(pos)    #This will shift pointer to that place (one line up)