Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更改子目录中特定文件类型中的行_Python_Python 3.x_Subdirectory_Readline_File Type - Fatal编程技术网

Python 更改子目录中特定文件类型中的行

Python 更改子目录中特定文件类型中的行,python,python-3.x,subdirectory,readline,file-type,Python,Python 3.x,Subdirectory,Readline,File Type,我正在尝试创建一个脚本,该脚本将搜索用户输入文件路径并打开所有.cix文件类型并替换第27行 到目前为止,我所做的工作都是针对单个文件夹,一次打开一个文件夹中的文件并修改所需的行。但如果我试图在包含子文件夹的文件夹中使用它,它将不起作用。它正在打开并保存文件,但它没有改变行,我也不知道哪里出了问题 from tkinter import * import os root = Tk() root.geometry('400x75') root.title('Labels Off') dirLa

我正在尝试创建一个脚本,该脚本将搜索用户输入文件路径并打开所有.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()
getListOfFiles返回当前目录和所有子目录的文件列表,并在此列表中的每个.cix文件上调用replace

但它是递归执行的,因此对于更深一层的子目录中的每个.cix文件,都已经调用了replace

由于replace基本上在ENABLELABEL=1和ENABLELABLE=0之间切换一行,因此对于位于根目录下奇数级别的子目录中的每个.cix文件,实际上没有任何更改

解决方案是首先获取完整的文件列表,然后为每个.cix文件调用replace:


我也不明白你想用counter实现什么。我只是省略了它。

好的,我不知道我以前创建文件列表的方法到底出了什么问题,但有些地方不正常。在尝试了一段时间后,我用这个替换了我以前的方法,现在它工作得非常好

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

如果不更改行,您如何知道它正在打开和保存文件?请注意,第[27]行是第28行,而不是第27行第[0]行是第一行。是的,我知道python以0开头。谢谢你。至于你的另一个问题。我可以看到它正在打开和保存,因为文件资源管理器中的修改日期正在更改。您看到printfilename输出了吗?错误输出呢?是的,我是这样做的…我在测试的时候把它们放进去,试图找出哪里出了问题***编辑哦,哇。。。你是说我在输出中看到了吗?我确实在输出中看到了文件名,但没有看到错误。区别与我在回答中描述的相同:它将获取文件列表与调用replace分开。walk还取代了递归。
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