python - 在Python中调用函数中的子函数来处理同一个文件?

标签 python python-2.7

我还在和python复制替换行打架,一个问题Here .基本上,我想统计一段模式的数量,并在行中更新它。我想我已经在我的问题中找到了问题:我调用了一个子函数来在主函数中交互同一个文件,并且交互有时会搞砸。我对编程还很陌生,我不知道如何用另一种方式来做这个复制-统计-替换-复制的事情。欢迎任何建议或提示。

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

# 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 在文件内部移动,所以要执行您想要执行的操作,您可以使用类似这样的方法,我将其组合在一起:

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()

评论几乎可以解释发生了什么。

给定一个输入文件

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 - 在Python中调用函数中的子函数来处理同一个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40540616/

相关文章:

python - 如何更新 Tkinter 中的标签,StringVar() 不起作用

python - 我可以在 RPM 中省略 .pyo 和 .pyc 文件吗?

python - 对于循环清晰度

python - 如何使用 find_element_by_xpath 或 selenium-python API 选择 'Start' 按钮并从以下 HTML 代码中单击它

python - 如何让 cython 将 MinGW 与 enthought canopy 分布一起使用

python - 如何在其他函数可以在 python 中访问的函数中创建变量?

python - 与python中的getattribute和setattribute混淆

Python堆叠直方图分组数据

python - Beautifulsoup:当我尝试使用 Beautifulsoup4 访问 soup.head.next_sibling 值时换行

python - Nonetype 对象没有附加属性将列表附加到 dict