업그레이드 후 이름 바꾸기 스크립트가 작동하지 않습니다. 새 것이 필요해

업그레이드 후 이름 바꾸기 스크립트가 작동하지 않습니다. 새 것이 필요해

재귀 파일 이름 바꾸기 - Python(Pyt2에서 Pyt3으로)을 업그레이드한 후 매우 유용한 Python 스크립트가 작동을 멈췄습니다. 누구든지 문제를 찾아 해결할 수 있나요? 감사합니다!

예를 들어 다음 파일은 다음과 같습니다.

'Linux příručka českého uživatele.pdf'
'LINUXTERO příkazy které se vždy hodí.pdf'
"Práce s Archívy příkazové řádka.pdf"
'Rekurzivní grep.txt'

다음 파일을 변경하십시오.

linux_prirucka_ceskeho_uzivatele.pdf'
linuxtero_prikazy_ktere_se_vzdy_hodi.pdf
prace_s_archivy_prikazove_radka.pdf
rekurzivni_grep.txt

프로그래머가 체코 사람이라 구글에서 영어로 번역해야 하는데...

스크립트를 시작하면 마사지가 다음과 같이 실패합니다.

linq@legion5:~/test-renamer/ask_stackexchange_folder$ vycisti.py
파일 "/home/linq/bin/vycisti.py", 62행
print "경고: '%s'은(는) 여전히 유효한 이름이 아닙니다." % fileName
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^
구문 오류: 'print' 호출 시 괄호가 누락되었습니다. 인쇄(...)를 의미합니까?

스크립트는 다음과 같습니다.

#!/usr/bin/python
# -*- coding:  utf-8

'''Renames all files and directories in the current directory to
    to have some culture. It also works recursively in nested ones
     directories. The changes are as follows:
     Czech characters -> English
     cancels all dashes and spaces at the beginning of the name (damn, what kind
             the names make up would deserve a few slaps)
     special characters are replaced by '_', I take the hyphen at mercy, but not at the beginning
     the (unnecessary) '_' around the hyphen is discarded
     multiple '_'s are replaced by a single occurrence
     everything will be converted to lowercase

     The result should be a title where there are only letters, underscores,
     numbers, periods and dashes (but not at the beginning).
     It writes exactly what it does to standard output
     Usage: vycisti.py [ > logfile ]
'''

import re
import os
import sys
import unicodedata

class RenameFiles:
    def __init__(self):
        if os.environ.get('OS','') == 'Windows_NT':
            self.locale = "cp1250"
        else: #probably linux
            local = os.environ.get('LANG', '')
            if '.' in local: #Fedora way
                self.locale = local.split('.')[1]
            else: #Debian
                self.locale = 'iso-8859-2'

    def cleanString(self, what):
        '''Gets rid of letters which are not in English alphabet'''
        assert type(what) == unicode
        normalized = unicodedata.normalize('NFKD', what)
        output = ''
        for c in normalized:
            if not unicodedata.combining(c):
                output += c
        return output

    def cleanName(self, fileName):
        '''Convert the givne string into a form which is suitable for a file name'''
        assert type(fileName) == str
        fileName = self.cleanString(fileName.decode(self.locale))
        fileName = re.sub("^[-\ ]+", "", fileName) #delete space or dash at the beginning
        invalid_stuff = re.compile(r"[^a-zA-Z0-9_\.-]+") #forbidden characters (non-alfanumerical)
        fileName = invalid_stuff.sub("_", fileName.strip()) #replace invalid stuff and spaces by _,
        fileName = re.sub("_+", "_", fileName) #squeeze continuous underscores to one _
        fileName = re.sub("-+", "-", fileName) #squeeze continuous dashes to one _
        fileName = re.sub("_*-_*", "-", fileName) #removes useless '_' round the dash
        fileName = re.sub("_*\._*", ".", fileName) #removes useless '_' round the dot
        fileName = re.sub("-*\.-*", ".", fileName) #removes useless '-' round the dot
        fileName = fileName.lower() #lower case
        valid_name=re.compile(r"^[a-z0-9_\.][a-z0-9_\.-]+$") #regular expression for feasible name
        if not valid_name.match(fileName):
            print "Warning: '%s' is still not valid name" % fileName
        return fileName.encode(self.locale)

    def renameFile(self, dir, fileName):
        '''Public: Renames the file fileName in the directory'''
        assert type(fileName) == str
        assert type(dir) == str
        try:
            new = self.cleanName(fileName)
        except:
            print "Problem: %s %s " % (fileName, sys.exc_info()[0] )
            new = ""
        if (new != "" and new != fileName):
            print "Renaming %s: %s -> %s" % (dir, fileName, new) #kontrolní výpis
            os.rename(dir+os.sep+fileName, dir+os.sep+'tmp')
            os.rename(dir+os.sep+'tmp', dir+os.sep+new)
            return

    def process_dir(self, dir):
        """process all files in the folder"""
        assert type(dir) == str
        for f in os.listdir(dir):
            fileName = dir + os.sep + f
            if os.path.isdir(fileName) and os.access(fileName, os.W_OK): #if it is directory
                self.process_dir(fileName) #process the elements in the directory
                self.renameFile(dir, f) #rename the directory itself
            else:
                self.renameFile(dir, f) #if it is a file
        return

if __name__=='__main__':
        renamer = RenameFiles()
        renamer.process_dir('.')

답변1

의견에서 언급했듯이 Python2는 더 이상 사용되지 않습니다. 이 문제를 해결하기 위한 다른 도구가 있습니다...

사용진주의rename:

$ rename -u utf8 -n  '
    BEGIN{use Text::Unidecode} # 'import' needed extra module
    s/.*/unidecode($&)/e;      # decode utf8 -> ascii
    s/\s+/_/g;                 # s/[[:space:]]/_/g
    y/A-Z/a-z/                 # translate uppercase to lower
' ./**/*.*                     # ** enable recursion¹

1 zsh기본적으로 bash는 shopt -s globstar명령 전에 실행되어야 합니다.

sudo apt install rename libtext-unidecode-perl패키지( ) 가 필요합니다 Debian*/Ubuntu/Mint....

출력이 만족스러우면 제거하십시오 -n(일명).dry-run

산출

rename(Linux příručka českého uživatele.pdf, linux_prirucka_ceskeho_uzivatele.pdf)
rename(LINUXTERO příkazy které se vždy hodí.pdf, linuxtero_prikazy_ktere_se_vzdy_hodi.pdf)
rename(Práce s archívy příkazové řádka.pdf, prace_s_archivy_prikazove_radka.pdf)
rename(Rekurzivní grep.txt, rekurzivni_grep.txt)

답변2

Python 2는 이제 죽은 언어입니다(2020년 1월 1일 일몰)

오랫동안 사람들은 Python 2 및 3과 호환되는 코드를 작성했습니다. 그래서 비슷하지만 여전히 차이점이 있습니다.

아마도 가장 유명한 것은 오류에서 언급된 것일 것입니다. 이제 "print" 문에는 괄호가 필요합니다.

"부자"를 인쇄하세요

지금이야

print("부자")

관련 정보