Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Don';t将最后一行字符写入文件_Python - Fatal编程技术网

Python Don';t将最后一行字符写入文件

Python Don';t将最后一行字符写入文件,python,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 +

我已经环顾了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()
我正在解析的文件很大,所以需要逐行处理

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

import re

target = open('output.txt', 'w')
results = []

for line in open('input.txt', 'r'):
    match = re.search(r'Stuff', line)
    if match:
        results.append(match.group())
target.write("\n".join(results))
target.close()
我应该如何最好地修改这段代码,以便在“if match”循环的最后一次迭代中,它不会将额外的换行符放在文件的末尾。它是否应该在文件末尾再次查看文件并删除最后一行(尽管看起来效率有点低)

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

如果有一种更具python风格/效率的方法来编写这段代码,我也欢迎对我自己的学习提出建议


谢谢你的帮助

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

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'

我还重新构造了您的代码(不需要
else:continue
,因为循环还能做什么?),并将其更改为使用
with
语句,以便自动关闭文件。

从您拥有的到您想要的最短路径可能是将结果存储在列表中,然后用换行符连接列表并将其写入文件

import re

target = open('output.txt', 'w')
results = []

for line in open('input.txt', 'r'):
    match = re.search(r'Stuff', line)
    if match:
        results.append(match.group())
target.write("\n".join(results))
target.close()

瞧,开头或结尾都没有额外的换行符。可能无法很好地扩展,但结果列表非常庞大。(就像我遗漏了
的所有内容一样

你可以做的另一件事是
截断文件
.tell()
提供文件中的当前字节数。然后我们减去一,并在那里截断它以删除尾随的换行符

with open('a.txt', 'w') as f:
    f.write('abc\n')
    f.write('def\n')
    f.truncate(f.tell()-1)
在Linux和MacOS上,
-1
是正确的,但在Windows上它需要是
-2
。确定哪一个的方法更像是检查
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)


kindal的回答也是正确的,只是你说它是一个大文件。此方法将允许您在千兆字节的RAM上处理一个TB大小的文件。

由于您反复执行相同的正则表达式,您可能希望事先编译它

import re
prog = re.compile(r'Stuff')
为了简单起见,我倾向于输入和输出到
stdin
stdout
。但这是品味(和规格)的问题

忽略有关删除最终下线的具体要求,仅针对您自己的学习内容,整个内容可以这样编写:

from itertools import imap
stdout.writelines(match.group() for match in imap(prog.match, stdin) if match)

[1] 正如其他人所评论的,这是一件坏事,当有人这样做时,这是非常烦人的。

文件末尾的换行不是“附加”,而是最后一行的换行!人们通常保留最后一条新线路。这就是为什么你看不到其他例子的原因。这是一个有趣的观点@tdelaney。我没有想到这一点,我想在很多情况下这并不是一个大问题。我正在解析的文件很大,所以需要逐行处理。我最初考虑过这一点,但文件太大,无法放入我正在使用的计算机内存。我写了一个小脚本,在对字符串进行重新搜索时循环10000次。第二个版本预编译了re。第一个调用re.py行230 10000次,第二个引用它10001次。同一文件的第192行加上一次。第二个版本有40k个函数调用,所用时间是第一个示例的两倍(30K个函数调用)。第二个版本引用了[_compile()(位于re.py行230上)10001次:@ChristoferOhlsson似乎您正在编译regex 10001次,而不是只编译一次。是吗?