4

匹配此表单中的文件。它总是以 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()

有没有更好、更 Pythonic 的方式?使用 recordbuffer 和 HASMEDIA 标志似乎是老生常谈了。有什么好的或更好的做法的例子或提示吗?

(另外,我愿意为这篇文章提供更中肯的标题)

4

2 回答 2

3

您可以将InvNoURL初始设置为,并且仅在两者都不是 FalsishNone时打印记录: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 lineline.startswith('InvNo: ')基于始终出现在行首的假设InvNo在您的示例中似乎是正确的,但您使用的事实line.find('InvNo: ')表明它'InvNo:'可能出现在该行的任何位置。

如果InvNo:仅出现在行首,则使用line.startswith(...)并删除line.find('InvNo: ')(因为它等于 0)。

否则,您将不得不保留'InvNo:' in lineand line.find(当然,Mediaand也是如此~EOR~)。使用类似代码的问题'Media' in line是,如果Tags可以包含任何内容,它可能包含字符串'Media'而不是真正的字段标题。

于 2013-11-05T20:52:47.520 回答
0

这是一个版本,如果您不想切片并且如果您需要再次写入相同的输出文件,您可能不需要,您可以将“w”更改为“a”。

with open('input_file', 'r') as f, open('output.dat', 'a') as media:
    write_to_file = False
    lines = f.readlines()
    for line in lines:
        if line.startswith('InvNo:'):
            first_line = 'IN ' + line.split()[1] + '\n'
        if line.startswith('Media:'):
            write_to_file = True
        if line.startswith('~EOR~') and write_to_file:
            url = 'blabla' #Put getUrl() here
            media.write(first_line + url + '\n' + '**\n')
            write_to_file = False
            first_line = ''
于 2013-11-05T21:29:09.217 回答