从文件中删除行

时间:2011-05-04 16:27:03

标签: python

我有很多以评论开头的文件!我需要删除所有这些,然后在下一行用#Mhz替换#Mhz并保持文件名相同。这样做的有效方法是什么?我可以读取文件并写入另一个目录中的新文件,然后手动删除它们,我猜想有更好的方法吗?

4 个答案:

答案 0 :(得分:3)

这是一种愚蠢的简单方法:

for line in in_file:
    if line[0] == '!':
        continue
    if line.startswith('#Mhz'):
        line = '# MHz' + line[4:] # Assuming it's megahertz, it's spelled MHz.
    out_file.write(line)

您可以阅读整个输入文件并将其拆分为行,然后打开文件进行写入,如果您想要这样做。

答案 1 :(得分:1)

如果您想要就地过滤一个(或多个)文件,fileimput模块是个不错的选择:

import fileinput
import sys

files_ = fileinput.input(['somefile.ext','anotherfile'], inplace=1)
for line in files_:
    if line.startswith('#Mhz'):
        sys.stdout.write('# Mhz' + line[4:])
    elif line[0] != '!':
        sys.stdout.write(line)
files_.close()  # cancel stdin & stdout redirection

fileinput.input()的第一个参数也可以是单个文件名而不是它们的序列,如果省略,它们会自动从连续的sys.argv[1:]个参数中取出,或者sys.stdin如果没有 - 允许它轻松地无缝地处理多个文件。它还可以自动生成备份文件,并具有许多其他有用的功能,所有这些功能都在documentation中详细介绍。

在Python 3.2+中,它也可以与Python 语句一起使用,这将允许上面的代码略微简化。

答案 2 :(得分:0)

你没有在问题中说什么/如果它需要在python中。

如果您只对一个或几个文件执行此操作,一个非常简单的方法是在vim中打开文件并键入

:%s/^!.*\n#Mhz/# Mhz/

可能

:%s/^!.*\n//

获取要删除的行#Mhz,然后保存文件并退出

:wq

答案 3 :(得分:0)

使用模式'r+',不需要open in 'r' - read - shut - reopen in 'w' - write -shut,所有内容都可以在同一个文件的同一个开头中完成

从这句话:

  

然后用#Mhz替换#Mhz   下一行

我知道'#Mhz'必须替换为'#Mhz',只有当'#Mhz'出现在一行中时在以'!

开头的行之后

如果是这样,以下代码可以处理不太大的文件(这样可以很容易地将它们加载到RAM中)

import re
regx = re.compile('^!.*\r?\n((?!!)(.*?)(#Mhz)(.*\r?\n))?',re.MULTILINE)

def repl(mat):
    return (mat.group(2)+'# Mhz'+mat.group(4) if mat.group(2)
            else mat.group(1))

with open(filename,'r+') as f:
    content = f.read()
    f.seek(0,0)
    f.write(regx.sub(repl,content))
    f.truncate()

对于笨拙的文件,必须使用另一种算法。