скрипт Python выполняется в интерпретаторе Python, завершается с ошибкой в ​​виде файла .py - PullRequest
0 голосов
/ 21 февраля 2019

мой скрипт:

from os import walk, path, rename

def rename(source, dest):
    for root, sub, files in walk(source):
        for file in files:
            if file.endswith('.mp4'):
                nbase = file.split('.mp4')[0]
                newname = nbase[0:len(nbase) - 12] + '.mp4'

                nsource = path.join(root, file)
                rdest = path.join(dest,newname)

                rename(nsource,rdest)

s = '/Users/ja/Desktop/t'
d = '/Users/ja/Desktop/u'

rename(s,d)

Этот скрипт, строка за строкой, будет работать в ipython, переименовывать и перемещать файл без проблем.когда он написан в сублиметексте или в текстедите и сохранен, он не выдает ошибок, но ничего не делает.Я на MacOS Mojave.

1 Ответ

0 голосов
/ 22 февраля 2019

Проблема в том, что вы дали своей функции имя rename, но внутри функции вы также пытаетесь использовать имя rename для вызова os.rename.В результате os.rename никогда не вызывается.Вместо этого ваша функция делает рекурсивный вызов самому себе со старыми и новыми именами файлов в качестве аргументов.

Этот рекурсивный вызов ничего не делает, потому что walk(source) ничего не возвращает при передаче имени файла.Конечным результатом является программа, которая корректно просматривает старое дерево каталогов, но никогда ничего не делает с файлами, найденными в этом дереве.

Чтобы исправить, присвойте своей функции другое имя, которое не конфликтует с os.rename.Может быть, что-то вроде rename_in_tree.В качестве альтернативы, импортируйте os.rename с именем, отличным от rename (from os import rename as os_rename), и вызывайте его через это новое имя внутри вашей функции.

Я не представляю, как это работает в ipython.Обработчики REPL иногда делают странные вещи с именами областей, но кажется странным, что он каким-то образом вызовет os.rename вместо того, чтобы делать рекурсивный вызов вашей функции.

...