2

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

这是我到目前为止的代码(我知道它很遥远):

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

谢谢你的帮助,本

4

2 回答 2

2

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

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

要匹配模式,您需要某种解析器。对于这样的模式,标准库中内置的正则表达式引擎re已经足够强大了……但是您需要学习如何为您的模式编写正则表达式。如果您已经了解基础知识,参考文档和正则表达式 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 代码,这意味着对于中等大小的文件可能有更好的性能,但对于大文件来说性能更差(和上限),等等。如果您自己无法弄清楚如何编写适当的表达式,并且没有需要解决的性能瓶颈,我会坚持使用显式循环。

于 2013-10-02T00:28:34.623 回答
0

首先,存在一些缩进问题,for循环无故缩进。其次,一旦您read将文件搜索到最后,就没有更多的行可供阅读。最后,该with命令允许您打开文件并声明其变量名,并允许它因错误或读取到最后而关闭,而不必担心手动关闭它。

但是,要执行实际逻辑,您可能需要使用正则表达式。您可以使用re.search()查找模式

  • \d+:\d+对于任意数量的 Digits ,冒号和任意数量的 Digits
  • \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 块会捕获这些文件并很好地释放所有内容。

于 2013-10-02T00:16:41.457 回答