匹配此窗体中的文件。它总是以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()
有没有更好的,更像Python的方法?使用recordbuffer和HASMEDIA标志似乎是老生常谈。有什么好的或更好的实践的例子或提示吗?你知道吗
(同时,我也愿意为这篇文章提供一个更切题的标题)
您可以将
InvNo
和URL
最初设置为None
,并且仅当InvNo
和URL
都不存在错误时才打印记录:注意:我将
'InvNo: ' in line
改为line.startswith('InvNo: ')
,基于InvNo
总是出现在行的开头的假设。在您的示例中似乎是这样,但是使用line.find('InvNo: ')
的事实表明'InvNo:'
可能出现在行中的任何位置。你知道吗如果
InvNo:
仅出现在行的开头,则使用line.startswith(...)
并删除line.find('InvNo: ')
(因为它将等于0)。你知道吗否则,您将不得不保留
'InvNo:' in line
和line.find
(当然,Media
和~EOR~
也是如此)。 使用像'Media' in line
这样的代码的问题是,如果Tags
可以包含任何内容,那么它可能包含字符串'Media'
,而不是真正的字段头。你知道吗这是一个版本,如果您不想切片,如果您需要再次写入同一输出文件,您可能不想,您可以将“w”更改为“a”。你知道吗
相关问题 更多 >
编程相关推荐