2016-10-04 4 views
2

Я написал сценарий, чтобы стереть данное слово из файлов docx, и я нахожусь в моем последнем препятствии, проверяя его в подпапках. Может кто-нибудь помочь мне в выяснении, где я не могу выполнить свою казнь. Он работает со всеми файлами в одном каталоге, но теперь он не будет также проверять элементы вложенных папок. Спасибо за вашу помощь.Перемещение файлов подпапок?

#!/usr/bin/env python3 

# Search and Replace all docx 

import os, docx 

from docx import Document 


findText = input("Type text to replace: ")        

#replaceText = input('What text would you like to replace it with: ')  


for dirs, folders, files in os.walk('.'): 
    for subDirs in dirs: 
     print('The Sub is ' + subDirs) 
     for fileNames in files: 
      print(subDirs + fileNames) 
      if fileNames.endswith('.docx'): 
       newDirName = os.path.abspath(subDirs) 
       fileLocation = subDirs + '\\' + fileNames 
       document = docx.Document(fileLocation) 
       print('Document is:' + fileLocation) 

       tables = document.tables 
       for table in tables: 
        for row in table.rows: 
         for cell in row.cells: 
          for paragraph in cell.paragraphs: 
           if findText in paragraph.text:        
            inline = paragraph.runs         
            for i in range(len(inline)): 
             if findText in inline[i].text: 
              text = inline[i].text.replace(findText, '') 
              inline[i].text = text 

       for paragraph in document.paragraphs:       
        if findText in paragraph.text:        
         inline = paragraph.runs         
         for i in range(len(inline)): 
          if findText in inline[i].text: 
           text = inline[i].text.replace(findText, '') 
           inline[i].text = text 

       document.save(fileLocation) 
+0

Вы говорите, что _it также не будет проверять элементы подпапки_ - означает ли это, что фактическая обработка docx не имеет значения. Можете ли вы обрезать этот образец до чего-то маленького, что все еще не удается, но не дает нам напряжения глаз ?! – tdelaney

+1

'os.walk' ходит по дереву, поэтому вам, скорее всего, не понадобится' для subDirs in dirs: ', который просто выполняет второй тур по подкаталогам. – tdelaney

+0

'dirs' будет строкой, текущим каталогом, поэтому вы выполняете итерацию по отдельным символам в строке, когда вы делаете' для subDirs in dirs'. –

ответ

3

os.walk перебирает подкаталогов, дающих 3-кортеж (dirpath, dirnames, filenames) для каждого подкаталога посещения. Когда вы это сделаете:

for dirs, folders, files in os.walk('.'): 
    for subDirs in dirs: 

все пошло не так. dirs - это имя подкаталога на каждой итерации, что означает, что for subDirs in dirs: действительно перечисляет символы в имени каталога. Так получилось, что первый каталог, который вы итерации ".", и просто удача его имя одного символьного каталога, так что ваш цикл for работает.

Как только вы входите в другой подкаталог (назовем его «Foo»), ваш код будет пытаться найти подкаталоги называемые foo\f, foo\o и foo\o во второй раз. Это не работает.

Но вы не должны переименовывать подкаталоги самостоятельно. os.walk уже делает. Кипящий код до части перечисления, это найдет все .docx в поддереве.

#!/usr/bin/env python3 

import os 

for dirpath, dirnames, filenames in os.walk('.'): 
    docx_files = [fn for fn in filenames if fn.endswith('.docx')] 
    for docx_file in docx_files: 
     filename = os.path.join(dirpath, docx_file) 
     print(filename) 
+0

Hey tdelany, это было потрясающее объяснение, и он отлично работал. Извинения за напряжение глаз. Ваше решение было таким элегантным методом. Если вы не возражаете, вы можете разбить линию basename. Похоже, у вас было несколько строк моего кода и все это было в одном. В очередной раз благодарим за помощь. – TragicWhale

+0

Я расширил операцию и использовал разумные имена. – tdelaney

+0

Не знаю, что это такое, но по крайней мере знаю, что посмотреть ... ха. Опять же, большое спасибо. Это было для работы, так что это сэкономит мне много времени. – TragicWhale

Смежные вопросы