如何解决在Python中随机搜索和修改文件
| 我觉得这很简单,但是我对python的了解还不足以正确地做到这一点。 我有两个文件: 带行的文件列出ID号以及是否使用该ID。格式为\'id,isUsed \'。 包含每个ID包含一个规则的规则的文件。 因此,我想做的是使用ID对对解析文件,然后基于该信息,我将在第二个文件中找到相应的规则,然后根据是否使用该规则来注释或取消注释该规则。 。 有没有一种简单的方法可以在第二个文件中搜索我要查找的规则,而不是每次都逐行搜索?另外,每次更改文件时都必须重写文件吗? 到目前为止,这是我目前还不真正知道实现ModifyRulesFile()的最佳方法是什么:def editRulesFile(pairFile,ruleFile):
pairFd = open(pairFile,\'r\')
ruleFd = open(ruleFile,\'rw\')
for line in pairFd.readLine():
id,isUsed = line.split(\',\')
modifyRulesFile(ruleFd,id,isUsed)
def modifyRulesFile(fd,isUsed):
for line in fd.readLine():
# Find line with id in it and add a comment or remove comment based on isUsed
解决方法
我建议您将规则文件读入字典(id-> rule)。然后,在阅读配置文件时,写出相应的规则(如果需要,请写上注释)。
一些伪代码:
rules = {}
for id,rule in read_rules_file():
rules[id] = rule
for id,isUsed in read_pairs_file():
if isUsed:
write_rule(id,rules[id])
else:
write_commented_rule(id,rules[id])
这样,您将只浏览每个文件一次。如果rules文件变得很长,则可能会耗尽内存,但是,通常,这需要很长时间才能完成!
您可以使用生成器来避免一次将所有对存储在内存中:
def read_pairs_file():
pairFd = open(pairFile,\'r\')
for line in pairFd.readLines():
id,isUsed = line.split(\',\')
yield (id,isUsed)
pairFd.Close()
,我不知道为什么以前没有想到这一点,但是还有另一种方法可以做到这一点。
首先,您阅读哪些规则应该使用(或不使用)到内存中,然后将其存储到字典中。
def readRulesIntoMemory(fileName):
rules = {}
# Open csv file with rule id,isUsed pairs
fd = open(fileName,\'r\')
if fd:
for line in fd.readlines():
id,\')
rules[id] = isUsed
然后,在读取另一个文件中的当前规则列表时,将所做的更改写入临时文件。
def createTemporaryRulesFile(temporaryFileName,rulesFileName,rules):
# Open current rules file for reading.
rulesFd = open(rulesFileName,\'r\')
if not rulesFd:
return False
# Open temporary file for writing
tempFd = open(temporaryFileName,\'w\')
if not tempFd:
return False
# Iterate through each current rule.
for line in rulesFd.readlines():
id = getIdFromLine(line)
isCommented = True # Default to commenting out rule
# If rule\'s id is was in csv file from earlier,save whether we comment
# the line or not.
if id in rules:
isCommented = rules[id]
if isCommented:
writeCommentedLine(tempFd,line)
else:
writeUncommentedLine(tempFd,line)
return True
现在,如果需要,我们可以将新的临时文件复制到原始文件中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。