在函数中调用子函数来处理Python中的同一个文件? [英] Call a sub-function in a function to deal with a same file in Python?

查看:94
本文介绍了在函数中调用子函数来处理Python中的同一个文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我仍然在用 python 复制和替换行,一个问题 这里.基本上,我想统计一个部分中一个模式的数量,并在行中更新它.我想我在我的问题中发现了问题:我调用一个子函数来交互主函数中的同一个文件,并且交互在时间上搞砸了.我对编程很陌生,我不知道如何以另一种方式进行复制统计替换复制.欢迎任何建议或提示.

I am still fight with python copy and replace lines, a question Here. Basically, I want to statistics the number of a pattern in a section, and renew it in the line. I think I have found the problem in my question: I call a sub-function to interate an same file in the main function, and the interation is messing up at time. I am pretty new to programming, I don't know how to do this copy-statistics-replace-copy thing in another way. Any suggestions or hints is welcome.

这是我现在得到的部分代码:

Here is part of code what I got now:

# sum number of keyframes
def sumKeys (sceneObj, objName):
    sceneObj.seek(0)
    block = []
    Keys = ""
    for line in sceneObj:
        if line.find("ObjectAlias " + objName + "\n") != -1:
            for line in sceneObj:
                if line.find("BeginKeyframe") != -1:
                    for line in sceneObj:
                        if line.find("default") != -1:
                            block.append(line.rstrip())
                            Keys = len(block)
                        elif line.find("EndKeyframe") != -1:
                            break
                    break
            break
    return (Keys)

# renew number of keyframes
def renewKeys (sceneObj, objName):
    sceneObj.seek(0)
    newscene = ""
    item = []
    for line in sceneObj:
        newscene += line
        for obj in objName:
            if line.find("ObjectAlias " + obj + "\n") != -1:
                for line in sceneObj:
                    if line.find("EndKeyframe") != -1:
                        newscene += line
                        break
                    if line.find("BeginKeyframe") != -1:
                        item = line.split()
                        newscene += item[0] + " " + str(sumKey(sceneObj, obj)) + " " + item[-1] + "\n"
                        continue
                    else:
                        newscene += line
    return (newscene)

原文:

lines
BeginObjects
lines
ObjectAlias xxx
lines
BeginKeyframe 34 12    ----> 34 is what I want to replace
lines
EndObject
BeginAnotherObjects
...

目标:

lines
BeginObjects
lines
ObjectAlias xxx
lines
BeginKeyframe INT 12  ---->INT comes from sumKeys function
lines
EndObject
BeginAnotherObjects
...

推荐答案

您可以使用 tellseek 在文件中移动,以便做您想做的做,你可以使用这样的东西,我一起破解:

You can use tell and seek to move inside a file, so to do what you want to do, you could use something like this, which I hacked together:

import re

# so, we're looking for the object 'HeyThere'
objectname = 'HeyThere'

with open('input.txt', 'r+') as f:
    line = f.readline()
    pos = f.tell()
    found = False
    while line:

        # we only want to alter the part with the 
        # right ObjectAlias, so we use the 'found' flag
        if 'ObjectAlias ' + objectname in line:
            found = True
        if 'EndObject' in line:
            found = False

        if found and 'BeginKeyframe' in line:

            # we found the Keyframe part, so we read all lines 
            # until EndKeyframe and count each line with 'default'
            sub_line = f.readline()
            frames = 0
            while not 'EndKeyframe' in sub_line:
                if 'default' in sub_line:
                    frames += 1
                sub_line = f.readline()

            # since we want to override the 'BeginKeyframe', we
            # have to move back in the file to before this line
            f.seek(pos)

            # now we read the rest of the file, but we skip the
            # old 'BeginKeyframe' line we want to replace
            f.readline()
            rest = f.read()

            # we jump back to the right position again
            f.seek(pos)

            # and we write our new 'BeginKeyframe' line
            f.write(re.sub('\d+', str(frames), line, count=1))

            # and write the rest of the file
            f.write(rest)
            f.truncate()
            # nothing to do here anymore, just quit the loop
            break

        # before reading a new line, we keep track
        # of our current position in the file
        pos = f.tell()
        line = f.readline()

评论几乎解释了正在发生的事情.

The comments pretty much explain what's going on.

给定一个输入文件

foo
bar
BeginObject
something
something
ObjectAlias NotMe
lines
more lines
BeginKeyframe 22 12   
foo
bar default
foo default
bar default
EndKeyframe
EndObject
foo
bar
BeginObject
something
something
ObjectAlias HeyThere
lines
more lines
BeginKeyframe 43243 12   
foo
bar default
foo default
bar default
foo default
bar default
foo default
bar
EndKeyframe
EndObject

它将替换该行

BeginKeyframe 43243 12   

BeginKeyframe 6 12   

这篇关于在函数中调用子函数来处理Python中的同一个文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆