我有很多以评论开头的文件!我需要删除所有这些,然后在下一行用#Mhz替换#Mhz并保持文件名相同。这样做的有效方法是什么?我可以读取文件并写入另一个目录中的新文件,然后手动删除它们,我猜想有更好的方法吗?
答案 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()
对于笨拙的文件,必须使用另一种算法。