将行附加到Python中具有额外新行的现有文件

时间:2012-06-28 13:23:14

标签: python

我有一个文本文件

apple
banana

现在你仔细观察最后有空白行。

在进行追加

f = open("file.txt",'a')
f.write("orange")
f.close()

我得到输出:

apple
banana

orange

我想在追加期间删除其间的空行。

我知道我可以手动转到该文件并删除额外的新行。但我想在python中做到这一点。因此每次空白行都会自动删除,如下所示:

apple
banana
orange

我搜索并试验但无效

5 个答案:

答案 0 :(得分:12)

使用:

f = open("file.txt",'ab')

'ab'而非仅'a'

答案 1 :(得分:5)

你不能,因为,附加模式确实如此:它附加。到换行符。您必须读入文件,删除最后的换行符,将其写出然后追加。

或者,打开文件进行读写(模式'r+'),寻找结尾,删除换行符,然后继续写作。

我认为这可以解决问题:

f = open('file.txt', 'r+')
f.seek(-2, 2) # last character in file
if f.read(2) == '\n\n':
   f.seek(-1, 1) # wow, we really did find a newline! rewind again!
f.write('orange')
f.close()

答案 2 :(得分:3)

一个简单的解决方案是覆盖整个文件,而不是在适当的位置修改它:

with open("file.txt") as input:
    # Read non-empty lines from input file
    lines = [line for line in input if line.strip()]
with open("file.txt", "w") as output:
    for line in lines:
        output.write(line)
    output.write("orange\n")

只要文件不是太大,此代码就可以正常工作。

您可以通过打开文件进行读写来查找文件末尾的换行符数,在第一个尾随换行符之后寻找位置并写入要追加的行来更有效地执行此操作。这样效率更高,但也需要更复杂的代码,所以如果简单的解决方案不够快,我只会这样做。

修改:以下是我采取更有效的方法:

with open("file.txt", "r+U") as f:
    try:
        f.seek(-1, 2)
        while f.read(1) == "\n":
            f.seek(-2, 1)      # go back two characters, since
                               # reading advances by one character
    except IOError:            # seek failed, so the file consists
        f.seek(0)              # exclusively of newline characters
    else:
        f.write("\n")          # Add exactly one newline character
    f.write("orange\n")        # Add a new line

这适用于任意数量的尾随换行符,包括根本没有或超过两个。

答案 3 :(得分:1)

这是另一个适用于该文件的解决方案:

with open('fruit.txt','rU+') as f:
    f.seek(-2,2)
    if(f.read(2) == "\n\n"):
        f.seek(-1,2)
    f.write('strawberry\n')

我们打开文件进行读写('r+')。然后我们从最后寻求2个字节。我们读了那些字节。 (文件指针不在文件末尾)。如果这些字节都是换行符,我们退回一个字节。然后我们写下我们的新数据。

编辑在更一般的情况下:

def goto_my_eof(f):
    """Position file pointer after last newline in file
       raises IOError if the file is "empty" (has no contents or only whitespace)
    """
    n=-1
    f.seek(n,2)
    mychar=f.read(1)
    #Step backward, one character at a time, looking for non-whitespace
    while not (mychar.strip()): 
        n-=1
        f.seek(n,2)
    mychar=f.read(1)
    #seek to the position after the non-whitespace position
    f.seek(n+1,2)
    #write one newline and continue.
    f.write('\n')

似乎工作(经过一些小试验)。此外,这将剥离任何空白(不仅仅是换行符)。 @SvenMarnach(更优雅地使用tryexcept来捕获错误)的这个和答案的某种组合将会很棒。对于我的函数,您可以将其括在try / except中,并在except IOError出现时寻找位置0(因为函数假定在其中有一些非空白文本)文件)。

答案 4 :(得分:0)

我会编写此代码以向文件添加新行:

f=open('newfile.txt','a')

t=raw_input('write here something you like: ')

f.write(t+'\n')

然后阅读文件中的内容,启动shell并输入:

with open('newfile.txt','a') as f:
   for l in f:
       print l

这将打印文件中的所有内容。

我希望它能回答你的问题!!