8

我有一个文本文件

苹果
香蕉

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

什么时候追加

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

我得到输出:

苹果
香蕉

橙

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

我知道我可以手动转到文件并删除额外的新行。但我想用python来做。因此,每次出现空行时,它都会像这样自动删除:

苹果
香蕉
橙

我搜索并尝试过但无济于事

4

5 回答 5

12

利用:

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

'ab' 而不是只有 'a'

于 2013-10-07T09:57:11.503 回答
6

你不能,因为,追加模式正是这样做的:它追加。到换行符。您必须读取文件,在末尾删除换行符,将其写出然后追加。

或者,打开文件进行读写(模式'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()
于 2012-06-28T13:26:52.797 回答
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

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

于 2012-06-28T13:27:42.617 回答
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,如果发生则寻找位置 0 except IOError(因为该函数假定文件中有一些非空白文本)。

于 2012-06-28T13:34:39.833 回答
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

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

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

于 2017-06-05T06:08:43.543 回答