繁体   English   中英

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

[英]Appending line to a existing file having extra new line in Python

我有一个文本文件

apple
banana

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

什么时候追加

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

我得到输出:

apple
banana

orange

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

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

apple
banana
orange

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

利用:

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

'ab' 而不是只有 'a'

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

或者,打开文件进行读写(模式'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()

一个简单的解决方案是覆盖整个文件,而不是就地修改它:

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

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

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

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(因为该函数假定文件中有一些非空白文本)。

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

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

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

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

有一个简单的出路。 以原始格式写入字符串并且不包含新空格。

 f=open('newfile.txt','a') 
 f.write(f"{your_string}")

这就对了。 文件中没有新行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM