我在这里What is an acceptable way to discard the first couple lines of text?问了一个先前的问题,得到了两个有趣的答案,这使我重新思考如何解决该问题。除非循环通过熊猫数据框比循环通过一堆文本行慢得多,否则我认为没有理由不使用数据框。 我最初确定的代码是:
try:
for year in range(start_year, current_year + 1):
url = 'https://www.sec.gov/Archives/edgar/full-index/%s/%s/master.idx' %(year, quarter)
r = requests.get(url)
lines = r.text.splitlines(True)
for line in lines[0:]:
row = line.split('|')
if len(row) == 5:
cik, company_name, filling_type, filling_date, edgar_url = row[0:5]
except requests.exceptions.HTTPError as e:
print(e)
但是,我认为最终用户可以更轻松地将熊猫用于其他方法(希望可以避免性能大幅下降)。我将代码更改为此:
df = pd.DataFrame()
try:
for year in range(start_year, current_year + 1):
url = 'https://www.sec.gov/Archives/edgar/full-index/%s/%s/master.idx' %(year, quarter)
r = requests.get(url)
lines = r.text.splitlines(True)
for line in lines[0:]:
row = line.split('|')
if len(row) == 5:
df.append(row)
print(df.head(10))
我相信这会给我我想要的东西。但是,有一种方法可以将其缩短为:
df = pd.DataFrame()
try:
for year in range(start_year, current_year + 1):
url = 'https://www.sec.gov/Archives/edgar/full-index/%s/%s/master.idx' %(year, quarter)
r = requests.get(url)
lines = r.text.splitlines(True)
df = pd.DataFrame([line.split('|') for line in lines if len(line.split('|') == 4])
我不能说我以前见过在数据框的构造函数中使用过if,尽管代码可以编译,但我似乎得到了一个空的数据框。我假设1)两次调用line.split('|')表示不返回任何行。有没有办法保持这一行?这种性能是否与仅使用大量列表一样好? 感谢您的输入。