匹配此表单中的文件它总是以InvNo开头,~EOR~是记录的结尾。

InvNo: 123
Tag1: rat cake
Media: d234
Tag2: rat pudding
~EOR~
InvNo: 5433
Tag1: strawberry tart
Tag5: 's got some rat in it
~EOR~
InvNo: 345
Tag2: 5
Media: d234
Tag5: rather a lot really
~EOR~

它应该变成
IN 123
UR blabla
**
IN 345
UR blibli
**

其中,UR是一个URL我想把invno作为第一个标签。**现在是记录结束标记这是有效的:
impfile = filename[:4]
media = open(filename + '_earmark.dat', 'w')

with open(impfile, 'r') as f:
    HASMEDIA = False
    recordbuf = ''

    for line in f:
        if 'InvNo: ' in line:
            InvNo = line[line.find('InvNo: ')+7:len(line)]
            recordbuf = 'IN {}'.format(InvNo)

        if 'Media: ' in line:
            HASMEDIA = True
            mediaref = line[7:len(line)-1]

            URL = getURL(mediaref) # there's more to it, but that's not important now
            recordbuf += 'UR {}\n'.format(URL))

        if '~EOR~' in line:
            if HASMEDIA:
                recordbuf += '**\n'
                media.write(recordbuf)
                HASMEDIA = False

            recordbuf = ''

media.close()

有更好,更像蟒蛇的方法吗?使用recordbuffer和HASMEDIA标志似乎是老掉牙了有什么好的或更好的实践的例子或提示吗?
(同时,我也愿意为这篇文章提供一个更贴切的标题)

最佳答案

您可以将InvNoURL初始设置为None,并且只有在InvNoURL都不出错时才打印记录:

impfile = filename[:4]
with open(filename + '_earmark.dat', 'w') as media, open(impfile, 'r') as f:
    InvNo = URL = None
    for line in f:
        if line.startswith('InvNo: '):
            InvNo = line[line.find('InvNo: ')+7:len(line)]

        if line.startswith('Media: '):
            mediaref = line[7:len(line)-1]
            URL = getURL(mediaref)

        if line.startswith('~EOR~'):
            if InvNo and URL:
                recordbuf = 'IN {}\nUR {}\n**\n'.format(InvNo, URL)
                media.write(recordbuf)
            InvNo = URL = None

注:我将'InvNo: ' in line改为line.startswith('InvNo: ')是基于InvNo总是出现在行首的假设。在您的示例中似乎是正确的,但是使用line.find('InvNo: ')这一事实表明'InvNo:'可能出现在行中的任何位置。
如果InvNo:只出现在行首,则使用line.startswith(...)并删除line.find('InvNo: ')(因为它等于0)。
否则,您必须保留'InvNo:' in lineline.find(当然,Media~EOR~也是如此)。
使用类似'Media' in line的代码的问题是,如果Tags可以包含任何内容,则它可能包含字符串'Media'而不是真正的字段头。

07-24 09:52