Как я могу изменить этот скрипт, чтобы включить функцию переименования?

1

У меня есть текущий script, который приведен ниже, который входит в файл с расширением .las и заменяет некоторые строки другими (например: cat → kitten, dog → puppy).

Все, что я хочу, это добавить функциональность в этот script, который переименовал бы любой файл .las в определенное имя в текущем каталоге, когда я запустил script (т.е.:.:....... → животные. LAS).

Я бы перетащил один файл в этот каталог, запустил script, который выполняет замену текста и переименование, а затем переместит файл из текущего каталога. Поэтому для этого script мне все равно, что он переписал бы несколько файлов .las для одного имени.

# read a text file, replace multiple words specified in a dictionary
# write the modified text back to a file

import re
import os
import time

# the dictionary has target_word:replacement_word pairs
word_dic = {
'cat' : 'kitten',
'dog' : 'puppy'
}


def replace_words(text, word_dic):
    """
    take a text and replace words that match a key in a dictionary with
    the associated value, return the changed text
    """
    rc = re.compile('|'.join(map(re.escape, word_dic)))
    def translate(match):
        return word_dic[match.group(0)]
    return rc.sub(translate, text)

def scanFiles(dir): 
    for root, dirs, files in os.walk(dir):
        for file in files:
            if '.las' in file:
            # read the file
                fin = open(file, "r")
                str2 = fin.read()
                fin.close()
            # call the function and get the changed text
                str3 = replace_words(str2, word_dic)
            # write changed text back out
                fout = open(file, "w")
                fout.write(str3)
                fout.close()
                #time.sleep(1)



scanFiles('')

Я вставлял script вместе из онлайн-примеров, поэтому я не знаю всех его внутренних разработок, поэтому, если у кого-то есть более элегантный/эффективный способ делать то, что делает этот script, я открыт для меняя его.

  • 1
    Вы хотите переименовать все файлы *.las в текущем каталоге в animals.las ? Вы собираетесь получить несколько файлов с одним и тем же именем? Как это должно работать?
  • 0
    Верный. Это будет рабочий каталог, куда я перетаскиваю один файл .las, запускаю скрипт и затем помещаю файлы .las с исправленными строками и именами файлов обратно в другой каталог. Таким образом, проблема с несколькими файлами не является проблемой.
Теги:
rename
wildcard

1 ответ

2
Лучший ответ

Если вы хотите закончить одним файлом с именем animals.las, содержащим содержимое *.las, тогда вы можете изменить функцию scanFiles, чтобы открыть animals.las в начале цикла, напишите переведенный вывод каждого *.las file to animals.las, а затем закрыть animals.las:

def scanFiles(dir): 
    fout = open("animals.las", "w")
    for root, dirs, files in os.walk(dir):
        for file in files:
            if '.las' in file:
            # read the file
                fin = open(file, "r")
                str2 = fin.read()
                fin.close()
            # call the function and get the changed text
                str3 = replace_words(str2, word_dic)
            # write changed text back out
                fout.write(str3)
                #time.sleep(1)
    fout.close()
  • 0
    Замена слова в файле .las уже работает. У меня проблемы с получением *.las для переименования в animals.las . До animals.las скрипта animals.las не существует, существует только случайный файл *.las . Как я уже отмечал выше, я понимаю, что это переименует любой .las в каталоге в animals.las . Это совершенно нормально для меня.
  • 0
    Хорошо, мои извинения, Кнаурот. Вы на самом деле позаботились о проблеме, создав новый файл на лету (я новичок во всем этом, поэтому я не понял эту часть). Я внес в свой код ваши исправления, и они сработали, за исключением того, что он дважды записал исходный файл *.las файл animals.las . Любые идеи о том, как я могу это исправить? Ой! Он перебирает вновь созданный animals.las поэтому файл записывается дважды. Тем не менее, как бы я получил эту итерацию только один раз?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню