不要将最终的新行字符写入文件

Fus*_*rry 2 python

我查看了StackOverflow并找不到我的具体问题的答案,所以请原谅我,如果我错过了什么.

import re

target = open('output.txt', 'w')

for line in open('input.txt', 'r'):
    match = re.search(r'Stuff', line)
    if match:
        match_text = match.group()
        target.write(match_text + '\n')
    else:
        continue
target.close()
Run Code Online (Sandbox Code Playgroud)

我正在解析的文件非常庞大,因此需要逐行处理.

这(当然)在文件末尾留下了一个额外的换行符.

我应该如何最好地更改此代码,以便在'if match'循环的最后一次迭代中,它不会将额外的换行符放在文件的末尾.它应该在最后再次查看文件并删除最后一行(虽然看起来有点低效)?

我发现的现有StackOverflow问题包括从文件中删除所有新行.

如果有更多pythonic /有效的方式来编写这段代码,我也会欢迎我自己学习的建议.

谢谢您的帮助!

kin*_*all 6

在下一行的开头写下每行的换行符.要避免在第一行的开头写入换行符,请使用初始化为空字符串的变量,然后在循环中设置为换行符.

import re

with open('input.txt') as source, open('output.txt', 'w') as target:

    newline = ''
    for line in source:
        match = re.search(r'Stuff', line)
        if match:
            target.write(newline + match.group())
            newline = '\n'
Run Code Online (Sandbox Code Playgroud)

我还重新编写了一些代码(else: continue不需要,因为循环还要做什么?)并将其更改为使用with语句,以便文件自动关闭.


Bri*_*and 6

您可以做的另一件事是truncate对该文件进行处理。 .tell()给我们文件中的当前字节数。然后,我们减去一个,并将其截断以删除尾随的换行符。

with open('a.txt', 'w') as f:
    f.write('abc\n')
    f.write('def\n')
    f.truncate(f.tell()-1)
Run Code Online (Sandbox Code Playgroud)

在Linux和MacOS上,-1正确,但在Windows上必须为-2。确定要检查的内容的更Pythonic方法os.linesep

import os
remove_chars = len(os.linesep)

with open('a.txt', 'w') as f:
    f.write('abc\n')
    f.write('def\n')
    f.truncate(f.tell() - remove_chars)
Run Code Online (Sandbox Code Playgroud)

kindal的答案也有效,但您说的是大文件。通过此方法,您可以在1 GB的RAM上处理1 TB大小的文件。