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

时间:2013-10-02 00:10:37

标签: python

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

这是我到目前为止的代码(我知道它已经过时了):

old_file = open("old_text.txt", "r")
new_file = open("new_text.txt", "w")

print (old_file.read())

for line in old_file.readlines():
    cleaned_line = line.replace("%/%/%", "")
    cleaned_line = line.replace("%:%", "")
    new_file.write(cleaned_line)

old_file.close
new_file.close

感谢您的帮助, 本

2 个答案:

答案 0 :(得分:1)

  

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

您无法使用str.replace来匹配模式或格式,只能使用文字字符串。

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

无论如何,这就是你如何做到这一点(在此过程中修复其他一些事情,其中​​大部分是由Lego Stormtroopr解释的):

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)

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

在不知道问题的确切定义的情况下,我不能保证这完全符合您的要求。是否要删除包含模式编号/编号/编号的所有行,删除所有该模式的行,将该模式删空并留下其余的一线?所有这些事情都是可行的,并且非常简单,只有re,但它们都完全不同。


如果你想变得有点棘手,可以使用单个re.sub表达式一次用空行替换所有匹配行,而不是一次迭代一行。这意味着一个稍微复杂的正则表达式与稍微简单的Python代码相比,它意味着对于中型文件可能性能更好,但对于大型文件来说性能更差(并且上限),等等。如果你不知道如何自己编写适当的表达式,并且没有修复的性能瓶颈,我会坚持使用显式循环。

答案 1 :(得分:0)

首先,存在一些缩进问题,其中for循环无缘无故缩进。其次,只要你read找到了你已经找到的文件,那么就没有更多的行可供阅读。最后,with命令允许您打开文件并声明其变量名称,并允许它因错误或读取而关闭,而不必担心手动关闭它。

但是,要执行实际逻辑,您可能希望使用regular expression。您可以使用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)

如果您只想在该行的开头匹配,re.match()可能是更好的选择。

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