我想修改一些基本的代码来下载和解析SEC文件,但是有些事情在解析我发现完全令人困惑的头文件。我不明白这是怎么回事以下代码的字典创建和头分配:在Python中的字典分配和返回混淆
def download_filing(filing):
data=None
try:
data=open(filing).read()
except:
print 'Failed to get data...'
if data==None: return None
headers={}
docs=[]
docdata={}
intext=False
inheaders=False
headerstack=['','','','','']
for line in data.split('\n'):
if line.strip()=='<DOCUMENT>':
# Beginning of a new document
docdata={'type':None,'sequence':-1,'filename':None,'description':None,'text':''}
elif line.strip()=='</DOCUMENT>':
# End of a documents
docs.append(docdata)
elif line.strip()=='<TEXT>':
# Text block
intext=True
elif line.strip()=='</TEXT>':
# End of the text block
intext=False
elif line.strip().startswith('<SEC-HEADER>'):
inheaders=True
elif line.strip().startswith('</SEC-HEADER>'):
inheaders=False
elif inheaders and line.strip()!='':
# Number of tabs before desc
level=line.find(line.strip())
sline=line.strip().replace(':','',1)
# Find the dictionary level
curdict=headers
for i in range(level):
curdict=curdict[headerstack[i]]
# Determine if this is a field or a another level of fields
if sline.find('\t')!=-1:
curdict[sline.split('\t')[0]]=sline.split('\t')[-1]
else:
headerstack[level]=sline
curdict.setdefault(sline,{})
elif intext:
docdata['text']+=line+'\n'
else:
# See if this is document metadata
for header in DOC_HEADERS:
if line.startswith(header):
field=DOC_HEADERS[header]
docdata[field]=line[len(header):]
return headers,docs
的目标是通过美国证券交易委员会提交这样解析:http://www.sec.gov/Archives/edgar/data/356213/0000898430-95-000806.txt
,并返回包含一个元组作为“标题”的字典字典和“文档”中的字典列表。它大部分对我来说很简单。打开文件,逐行阅读,并生成一些控制流程,告诉函数是否位于文档的标题部分或文档的文本部分。我也理解最后的列表创建算法,它将所有的“docdata”附加在一起。
然而,标题部分正在让我大开眼界。我或多或少地理解标题解析器如何基于每个块项目之前的标签数量创建词典巢,然后确定每个键的粘贴位置。我不明白的是它是如何填充到“标题”变量中的。它似乎是分配标题的结果,这似乎完全倒退给我。该程序将标题定义为顶部的空白字典,然后对于每一行,赋值将这个空字典分配给结果,然后出现。然后它返回看起来再也没有被正式操纵过的标题。
我猜,这我完全缺乏的对象分配Python中是如何工作的理解。我确定这真的很明显,但我没有看到用这种方式编写的程序。
看起来备案是XML。没有可以使用的XML解析模块而不是编写自己的代码? – Barmar
这不是正式的XML。这是美国证券交易委员会在90年代初提出的一个非常古老的SGML规范。它完全抵制任何正式的XML/HTML解析器或像BeautifulSoup这样的模糊解析器的解析。你基本上必须写自己的。 – WildGunman