Изменение строк в указанных c типах файлов в подкаталогах - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь создать скрипт, который будет искать по пути ввода файла пользователя и открывать все типы файлов .cix и заменять строку 27.

То, что у меня есть, работает с отдельными папками, открывающими файлы в течение одного и изменяя желаемую строку. Но если я пытаюсь использовать его в папке с подпапками, это не работает. Он открывает и сохраняет файл, но не меняет строку, и я не могу понять, где я иду не так.

from tkinter import *
import os

root = Tk()
root.geometry('400x75')
root.title('Labels Off')

dirLabel = Label(root, text='Directory Path:').pack()
e = Entry(root, width='50')
e.pack()

os.listdir(path='.')

def replace(filename):
    f = open(filename, 'r')
    lines = f.readlines()
    print(filename)
    f.close()
    if 'ENABLELABEL=1' in lines[27]:
        lines[27] = '   ENABLELABEL=0\n'
    elif 'ENABLELABEL=0' in lines[27]:
        lines[27] = '   ENABLELABEL=1\n'
    else:
        print('err')

    f = open(filename, 'w')
    f.write(''.join(lines))
    f.close()

def getListOfFiles(dirName):
    # create a list of file and sub directories 
    # names in the given directory 
    listOfFile = os.listdir(dirName)
    allFiles = list()
    # Iterate over all the entries
    for entry in listOfFile:
        # Create full path
        fullPath = os.path.join(dirName, entry)
        # If entry is a directory then get the list of files in this directory 
        if os.path.isdir(fullPath):
            allFiles = allFiles + getListOfFiles(fullPath)
        else:
            allFiles.append(fullPath)

    counter = 0
    for file in allFiles:
        if file.endswith('.cix'):
            replace(file)
        else:
            allFiles.pop(counter)
        counter += 1

    return allFiles

def run():
    dirName = e.get()
    getListOfFiles(dirName)
    e.delete(0, END)

submit = Button(root, text='Run', command=run).pack()

mainloop()

Ответы [ 2 ]

1 голос
/ 24 марта 2020

ОК, я не знаю точно, что не так с моим предыдущим методом создания списка файлов, но что-то не работает правильно. Попробовав некоторое время, я заменил свой предыдущий метод этим, и теперь он отлично работает,

def getListOfFiles(dirName):

    allFiles = []
    for r, d, f, in os.walk(dirName):
        for file in f:
            if '.cix' in file:
                allFiles.append(os.path.join(r, file))


    for file in allFiles:
        replace(file)

    return allFiles
0 голосов
/ 24 марта 2020

getListOfFiles возвращает список файлов для текущего каталога и всех подкаталогов , а также вызывает replace для каждого .cix файла в этом списке.

Но он делает это рекурсивно, поэтому для каждого .cix файла, который находится в подкаталоге на один уровень глубже, replace уже был вызван.

Поскольку replace в основном переключает строку между ENABLELABEL=1 и ENABLELABLE=0, для каждого Файл .cix, который находится в подкаталоге с нечетным числом уровней ниже каталога root, фактически не изменяется.

Решение - сначала получите полный список файлов и затем позвоните replace для каждого .cix файла:

def getListOfFiles(dirName):
    # create a list of file and sub directories 
    # names in the given directory 
    listOfFile = os.listdir(dirName)
    allFiles = list()
    # Iterate over all the entries
    for entry in listOfFile:
        # Create full path
        fullPath = os.path.join(dirName, entry)
        # If entry is a directory then get the list of files in this directory 
        if os.path.isdir(fullPath):
            allFiles = allFiles + getListOfFiles(fullPath)
        else:
            allFiles.append(fullPath)

    # no replace(file) here

    return allFiles

def run():
    dirName = e.get()
    allFiles = getListOfFiles(dirName)

    # instead, do it here
    for file in allFiles:
        if file.endswith('.cix'):
            replace(file)

    e.delete(0, END)

(я также не понял, что вы пытались добиться с counter. Я просто опустил его.)

...