[英]Python flow control with Flag?
匹配此表單中的文件。 它始終以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標志似乎是老帽子。 有關良好或更好實踐的任何示例或提示?
(另外,我願意接受關於這篇文章的更多標題的建議)
您可以將InvNo
和URL
最初設置為None
,並且僅在InvNo
和URL
都不是Falsish時打印記錄:
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
總是出現在行的開頭,將'InvNo: ' in line
更改為line.startswith('InvNo: ')
。 在您的示例中似乎是正確的,但是您使用line.find('InvNo: ')
表明'InvNo:'
可能出現在該行的任何位置。
如果InvNo:
僅出現在行的開頭,則使用line.startswith(...)
並刪除line.find('InvNo: ')
(因為它等於0)。
否則,你必須'InvNo:' in line
和line.find
保留'InvNo:' in line
(當然, Media
和~EOR~
)。 使用像'Media' in line
這樣'Media' in line
代碼的問題在於,如果Tags
可以包含任何內容,它可能包含字符串'Media'
而不是真正的字段標題。
這是一個版本,如果你不想切片,如果你需要再次寫入同一個輸出文件,你可能不會,你可以將'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 = ''
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.