我查看了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 /有效的方式来编写这段代码,我也会欢迎我自己学习的建议.
谢谢您的帮助!
在下一行的开头写下每行的换行符.要避免在第一行的开头写入换行符,请使用初始化为空字符串的变量,然后在循环中设置为换行符.
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语句,以便文件自动关闭.
您可以做的另一件事是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大小的文件。
| 归档时间: |
|
| 查看次数: |
5922 次 |
| 最近记录: |