2013-10-02 33 views
1

我想用文件中的空白替换某一格式的所有行,即替换一行数字/数字/数字(如日期)和数字:数字(如时间)与“”。我想从旧文件读取,然后将清理过的版本保存为新文件。字符串替换和保存到新文件(Python v2.7)

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

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

将'old_file.close'改为'old_file.close()'对于new_file相同 –

+1

[''with'命令的这个问题将会很方便](http://stackoverflow.com/questions/9282967/how-to -open-a-file-using-the-open-with-statement) – 2013-10-02 00:14:08

+0

你在for循环中不需要'old_file.readlines():'。你可以在'old_file'中输入':老实说,在我读代码之前,我甚至都不知道'readlines'甚至是存在的。 – Shashank

回答

0

首先,有一些压痕问题,其中for循环没有理由缩进。其次,只要你搜索到的文件到最后,所以没有更多的行要阅读。最后,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块会捕获这些文件并很好地发布所有文件。

  • +2

    'readlines()'在这里除了性能问题外没有添加任何东西;只需在'old_file:'中输入'。 – abarnert

    +2

    更重要的是,我不认为这实际上解决了OP的问题。从他的描述来看,他希望将所有行与格式编号/数字/编号匹配,而不是所有行都使用字符串'%/%/%',这是他不知道该怎么做的部分。 – abarnert

    +0

    @abarnert更新为包含数字匹配逻辑。 – 2013-10-02 00:31:46

    1

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

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

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

    总之,这里的你如何做到这一点(沿途固定一些其他的东西,大多由乐高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) 
    

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

    不知道你的问题的确切定义,我不能保证这确实是你想要的。你是否想要删除包含模式编号/编号/编号的所有行,将所有没有任何内容的行全部清空但是表示该模式,只显示该模式并将该行的其余部分单独留空?所有这些都是可行的,很容易,re,但他们都做了一点不同。


    如果你想获得一些技巧,你可以使用一个re.sub表达式替换所有匹配线,空行的一次,而不是迭代他们一次一个。这意味着稍微更复杂的正则表达式与略微更简单的Python代码相比,这意味着对于中等大小的文件可能会有更好的性能,但对于大型文件而言性能(以及上限)会更差,等等。如果你不知道如何自己编写合适的表达式,并且没有性能瓶颈可以解决,我会坚持使用显式循环。

    +0

    我正在寻找所有包含格式数字/数字/数字或数字:数字的字符串的所有行。我相信我可以从你和乐高Stormtroopr的答案中找出应该做些什么。感谢您的快速回复。 – Ben