Случайный поиск и модификация файла в python - PullRequest
2 голосов
/ 25 мая 2011

Я чувствую, что это просто, но я просто недостаточно разбираюсь в python, чтобы сделать это правильно.

У меня есть два файла:

  1. Файл со строками, в которых указан номер идентификатора и используется ли этот идентификатор. Формат: «id, isUsed».
  2. Файл с правилами, содержащий одно правило для каждого идентификатора.

Итак, я хочу разобрать файл с парами, использующими 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, id, isUsed):
    for line in fd.readLine():
        # Find line with id in it and add a comment or remove comment based on isUsed

Ответы [ 2 ]

4 голосов
/ 25 мая 2011

Я предлагаю вам прочитать файл правил в словарь (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])

Таким образом, вы пройдете через каждый файл только один раз. Если файл правил становится очень длинным, вам может не хватить памяти, но обычно это занимает много времени!

Вы можете использовать генераторы, чтобы избежать одновременного хранения всех пар в памяти:

def read_pairs_file():
   pairFd = open(pairFile, 'r')
   for line in pairFd.readLines():
      id, isUsed = line.split(',')
      yield (id, isUsed)
   pairFd.Close()
0 голосов
/ 30 мая 2011

Я не знаю, почему я не думал об этом раньше, но есть другой способ сделать это.

Сначала вы читаете, какие правила следует использовать (или не использовать) в памяти,Я сохранил его в словаре.

def readRulesIntoMemory(fileName):
    rules = {}

    # Open csv file with rule id, isUsed pairs
    fd = open(fileName, 'r')
    if fd:
        for line in fd.readlines():
            id,isUsed = line.split(',')
            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

Теперь мы можем скопироватьновый временный файл поверх оригинала, если мы хотим.

...