字符串替换并保存到新文件(Python v2.7)

字符串替换并保存到新文件(Python v2.7),python,Python,我试图用一个空格替换文件中某一格式的所有行,即用“”替换数字/数字/数字(如日期)和数字:数字(如时间)行。我想从旧文件中读取,然后将删除的版本另存为新文件 这是迄今为止我所掌握的代码(我知道它已经过时了): 谢谢你的帮助, Ben首先,存在一些缩进问题,其中循环的是无缘无故缩进的。第二,只要你读到你所查找的文件的末尾,就没有更多的行要读了。最后,with命令允许您打开一个文件并声明其变量名,并允许它在错误或读取到最后时关闭,而不必担心手动关闭它 然而,要执行实际逻辑,您可能需要使用。您可以使用

我试图用一个空格替换文件中某一格式的所有行,即用“”替换数字/数字/数字(如日期)和数字:数字(如时间)行。我想从旧文件中读取,然后将删除的版本另存为新文件

这是迄今为止我所掌握的代码(我知道它已经过时了):

谢谢你的帮助,
Ben

首先,存在一些缩进问题,其中循环的
是无缘无故缩进的。第二,只要你
读到你所查找的文件的末尾,就没有更多的行要读了。最后,
with
命令允许您打开一个文件并声明其变量名,并允许它在错误或读取到最后时关闭,而不必担心手动关闭它

然而,要执行实际逻辑,您可能需要使用。您可以使用
re.search()
查找模式

  • \d+:\d+
    表示任意位数、冒号和任意位数
  • \d+\/\d+\/d+
    三批任意数字,中间有一个文本
    /
您想要的代码更接近于此:

import re
with open("old_text.txt", "r") as oldfile, open("new_text.txt", "w") as new_file:
    for line in old_file:
        # This will match if this pattern is anywhere in the line
        if re.search("\d+:\d+", line) is not None:
            line = ""
        # This will match if this pattern is anywhere in the line
        if re.search("\d+\/\d+\/d+", line) is not None:
            line = ""
        new_file.write(line)
如果你只想在行首匹配,可能会是一个更好的选择

在这里,我们用两个文件声明一个块,循环遍历
旧的\u文件
,清理每一行并写入
新的\u文件
。一旦到达
旧\u文件的末尾
,所有文件都将完全关闭。如果找不到任何一个文件,或者发生错误,with块将捕获这些文件并很好地释放所有文件

我试图用一个空格替换文件中某一格式的所有行,即用“”替换数字/数字/数字(如日期)和数字:数字(如时间)行

不能使用
str.replace
来匹配模式或格式,只能使用文字字符串

要匹配模式,需要某种解析器。对于这样的模式,标准库as中内置的正则表达式引擎已经足够强大了……但是您需要学习如何为您的模式编写正则表达式。如果你已经知道了基础知识,那么参考文档和文档是非常棒的;如果没有,您应该在其他地方搜索教程

不管怎样,下面是你如何做到这一点的(一路上解决一些其他问题,其中大部分由乐高冲锋队解释):

另外,请注意,我在第二个
sub
中使用了
cleaned_line
;只需再次使用
,就像在原始代码中一样,意味着我们将丢失第一次替换的结果

如果不知道你的问题的确切定义,我不能保证这正是你想要的。是否要将包含图案编号/编号/编号的所有行留空,将除该图案以外的所有行留空,仅将该图案留空,并保留该行的其余部分?通过
re
,所有这些事情都是可行的,而且非常简单,但它们的做法都有点不同



如果您想变得更复杂一些,可以使用一个
re.sub
表达式一次将所有匹配行替换为空行,而不是一次迭代一行。这意味着regexp要比Python代码稍微复杂一些,这意味着中等大小的文件可能会有更好的性能,而大型文件的性能可能会更差(还有一个上限),等等。如果您自己无法找到如何编写适当的表达式,并且没有性能瓶颈需要解决,我会坚持使用显式循环。

更改
旧的\u文件。关闭
旧的\u文件。关闭()
对于新的\u文件,您不需要在for循环中使用
旧的\u文件。readlines():
。您可以只对旧文件中的行执行
老实说,在我阅读您的代码之前,我甚至不知道
读取行
甚至存在。@ShashankGupta实际上,在该代码中,
读取行
(或
对于文件中的行
)不会做任何事情,因为
文件.read()
调用一直到文件末尾。这意味着没有什么可以重复。@ShashankGupta:有一半的教程教人们如何使用
阅读行。我不知道为什么。如果由我决定,
readlines
如果没有
hint
参数,那么它在3.x中就会被废弃,而不仅仅是在文件对象文档(没有人知道如何在3.x中找到)中强调它是不必要的
除了性能问题之外,没有在此处添加任何内容;只需对旧文件中的行执行
。更重要的是,我不认为这实际上解决了OP的问题。根据他的描述,他希望将所有行与格式number/number/number匹配,而不是将所有行与文本字符串
%/%/%
匹配,这是他不知道怎么做的部分。@abarnert更新为包含数字匹配逻辑。@ShashankGupta:Python中使用
with
作为一对匹配的输入和输出文件是一个非常常见和公认的习惯用法。事实上,这是将multi-context
with
语句添加到语言中的主要原因。@ShashankGupta我正在同时使用这两个文件做
。为什么它们不应该在一起呢?我希望完全清空所有包含number/number/number或number:number格式字符串的行。我相信我能从你和乐高冲锋队的答案中找到答案。感谢您的快速回复。@abarnert谢谢您的回答!
import re
with open("old_text.txt", "r") as oldfile, open("new_text.txt", "w") as new_file:
    for line in old_file:
        # This will match if this pattern is anywhere in the line
        if re.search("\d+:\d+", line) is not None:
            line = ""
        # This will match if this pattern is anywhere in the line
        if re.search("\d+\/\d+\/d+", line) is not None:
            line = ""
        new_file.write(line)
import re

with open("old_text.txt") as old_file, open("new_text.txt", "w") as new_file:
    for line in old_file:
        cleaned_line = re.sub(r'\d+/\d+/\d+', '', line)
        cleaned_line = re.sub(r'\d+:\d+', '', cleaned_line)
        new_file.write(cleaned_line)