найти и заменить в имени файла - PullRequest
0 голосов
/ 20 января 2011

Я запускаю скрипт, который выдает ошибку, если имя файла содержит «.» или «+» в нем, поэтому я пытаюсь создать сценарий, который заменяет все «.» с '_', замена '+' работает нормально. Но проблема с заменой на «.» в том, что если я не разделю файл - тогда все мои файлы будут удалены !! Итак, я попытался разбить файл, но теперь он говорит, что скрипт запущен, но все '.' Все еще там !!

вот мой сценарий:

folder = "C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1"

import glob, os
for filename in glob.glob(os.path.join(folder, "*+*")):
   os.rename(filename, filename.replace('+','_'))

for root, dirs, filenames in os.walk(folder): # returms root, dirs, and files
    for filename in filenames:
        filename_split = os.path.splitext(filename) # filename and extensionname (extension in [1])
        filename_zero = filename_split[0]
        extension = str.upper(filename_split[1])
        for filename_zero in glob.glob(os.path.join(filename_zero, "*.*")):
            os.rename(filename_zero, filename_zero.replace('.','_'))

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 20 января 2011

Я не понимаю логику вашего кода. Я добавил печатные заявления:

folder = "C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1"

import glob, os
for filename in glob.glob(os.path.join(folder, "*+*")):
    print "I rename '+' to '_' in\n"+filename
    os.rename(filename, filename.replace('+','_'))


print '\n\n---- Now, there after, are the filenames in \n     '+folder


for root, dirs, filenames in os.walk(folder): # returms root, dirs, and files
    for filename in filenames:
        print '\nfilename==',filename
        filename_split = os.path.splitext(filename) # filename and extension name (extension in [1])
        filename_zero = filename_split[0]
        extension = str.upper(filename_split[1])
        print 'filename_zero==',filename_zero
        print 'os.path.join(filename_zero, "*.*")==',os.path.join(filename_zero, "*.*")
        print 'glob.glob(os.path.join(filename_zero, "*.*"))==',glob.glob(os.path.join(filename_zero, "*.*"))
        for filename_zero in glob.glob(os.path.join(filename_zero, "*.*")):
            print '  filename_zero in glob.glob(os.path.join(filename_zero, "*.*")) ==',filename_zero
            os.rename(filename_zero, filename_zero.replace('.','_'))

А вот и результат

I rename '+' to '_' in
C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1\+po.rt.hos.txt
I rename '+' to '_' in
C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1\ar.am+is.doc
I rename '+' to '_' in
C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1\ath+os.html
I rename '+' to '_' in
C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1\d'a.rtagn+an
I rename '+' to '_' in
C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1\dum+as.doc
I rename '+' to '_' in
C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1\ki.kiouili.do+c


---- Now, there after, are the filenames in 
     C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1

filename== ar.am_is.doc
filename_zero== ar.am_is
os.path.join(filename_zero, "*.*")== ar.am_is\*.*
glob.glob(os.path.join(filename_zero, "*.*"))== []

filename== arctic.txt
filename_zero== arctic
os.path.join(filename_zero, "*.*")== arctic\*.*
glob.glob(os.path.join(filename_zero, "*.*"))== []

filename== ath_os.html
filename_zero== ath_os
os.path.join(filename_zero, "*.*")== ath_os\*.*
glob.glob(os.path.join(filename_zero, "*.*"))== []

filename== atla.ntic.html
filename_zero== atla.ntic
os.path.join(filename_zero, "*.*")== atla.ntic\*.*
glob.glob(os.path.join(filename_zero, "*.*"))== []

filename== d'a.rtagn_an
filename_zero== d'a
os.path.join(filename_zero, "*.*")== d'a\*.*
glob.glob(os.path.join(filename_zero, "*.*"))== []

filename== dum_as.doc
filename_zero== dum_as
os.path.join(filename_zero, "*.*")== dum_as\*.*
glob.glob(os.path.join(filename_zero, "*.*"))== []

filename== ki.kiouili.do_c
filename_zero== ki.kiouili
os.path.join(filename_zero, "*.*")== ki.kiouili\*.*
glob.glob(os.path.join(filename_zero, "*.*"))== []

filename== _po.rt.hos.txt
filename_zero== _po.rt.hos
os.path.join(filename_zero, "*.*")== _po.rt.hos\*.*
glob.glob(os.path.join(filename_zero, "*.*"))== []

glob.glob (os.path.join (filename_zero, ". ")) всегда [], потому что os.path.join (filename_zero, ".") - это имя файла, а не путь, тогда инструкция os.rename (filename_zero, filename_zero.replace ('.', '_')) никогда не выполняется что-нибудь.

Кстати, я предлагаю вам заменить

for root, dirs, filenames in os.walk(folder):
    for filename in filenames:

с

for filename in os.listdir(folder):
    if os.path.isfile(filename):

или лучше имо (там на один отступ меньше)

for filename in ( f in os.listdir(folder) if os.path.isfile(f) ):

Я думаю, что вы взяли тупик. Если я правильно понимаю, на самом деле вы хотите заменить точки и '+' в имени файла перед расширением, то есть не заменить точку, которая разделяет расширение и то, что перед расширением в расширении. имя файла, ни «+» в расширении. В любом случае, было бы глупо, если бы расширение имело точку и знак «+».

Итак, вы пытаетесь использовать glob. Но лично, из-за особого случая "." который ограничивает расширение, я не знаю, как glob действительно может быть использован для этой цели.

Так что я думаю, вы должны пойти другим путем. Вместо того, чтобы использовать glob для проверки всех имен файлов, чтобы убедиться, что они совпадают с шаблоном подстановочных знаков, и для возврата только хороших имен файлов, которые необходимо обработать, мы должны выполнить итерацию в списке имен файлов и попытаться заменить '+' и '.' в части перед расширением. Да, в этом месте будут имена файлов, которые не будут иметь точек и «+», и программа будет тщетной работой. Но, в любом случае, та же самая работа выполняется за кулисами. Итак, работайте против работы, я предпочитаю кодировать то, что я могу себе представить, то есть без суеты.

Следующий код кажется мне коротким и эффективным решением

folder = "C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1"

import os
separ = os.sep

for n in os.listdir(folder):
    print n
    if os.path.isfile(folder + separ + n):
        filename_zero, extension = os.path.splitext(n)
        os.rename(folder + separ + n , folder + separ + filename_zero.replace('.','_').replace('+','_') + extension)

print '\n--------------------------------\n'
for n in os.listdir(folder):
    print n

Результат

+po.rt.hos.txt
ar.am+is.doc
arctic.txt
ath+os.html
atla.ntic.html
d'a.rtagn+an
dum+as.doc
ki.kiouili.do+c

--------------------------------

arctic.txt
ar_am_is.doc
ath_os.html
atla_ntic.html
d'a.rtagn+an
dum_as.doc
ki_kiouili.do+c
_po_rt_hos.txt
1 голос
/ 20 января 2011

почему вы используете glob внутри цикла os.walk for, а также перезаписываете переменную filename_zero?

for root, dirs, filenames in os.walk(folder): 
    for filename in filenames:
        filename_split = os.path.splitext(filename) # filename and extensionname (extension in [1])
        filename_zero = filename_split[0]
        extension = filename_split[1].upper()
        if "." in filename_zero:
            os.rename(filename_zero, filename_zero.replace('.','_'))

(не проверено)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...