저는 Bloomberg의 Open Symbology에서 마스터 데이터 테이블을 다운로드 중입니다. csv로 난에 관심이 아니에요 열이 있습니다. csv 파일 내에서 발견 된 컬럼의 서브 세트에서 namedtuple 인스턴스를 생성 할 수있는 효율적인/파이썬 방법은csv의 열을 namedtuple 함수로 건너 뛰는보다 효율적인 방법은 무엇입니까?
질문
있습니까? 다음과 같이 내가
내 현재 프로세스 (아래 파이썬 3.3 코드)를 시도했습니다 무엇
은 다음과 같습니다
- 는 CSV의 모든 열이있는 TempRecord의 namedtuple을 만듭니다.
- csv 파일의 각 레코드에 대해 TempRecord 인스턴스를 만듭니다.
- 주어진 TempRecord에서 BSYMRecord (더 적은 수의 특성 및 이름이 바뀐 특성)를 만듭니다.
- 수율 BSYMRecord.
이것은 실제로 비효율적 인 냄새를 풍깁니다.
from csv import reader
from collections import namedtuple
from datetime import date
from io import BytesIO
from urllib.request import urlopen
from urllib.error import HTTPError
from zipfile import ZipFile
def bsym_records(sector, security_type, file_date):
"""Yield BSYMRecord for given sector and security type."""
template = 'http://bdn-ak.bloomberg.com/precanned/{s}_{t}_{d}.txt.zip'
url = template.format(s=sector, t=security_type, d=file_date)
response = urlopen(url)
zipfile = ZipFile(BytesIO(response.read()))
for filename in zipfile.namelist():
with zipfile.open(filename) as f:
line = f.readline().decode('utf-8')
headers = line.strip().replace(' ', '_').split('|')
TempRecord = namedtuple('BSYMRecord', headers)
while True:
line = f.readline().decode('utf-8')
if line[0] == '#':
break
t = TempRecord._make(line.strip().split('|'))
yield reduce_bsym_record(t)
BSYMRecord = namedtuple('BSYMRecord', ['name',
'ticker',
'pricing_source',
'security_type',
'market_sector',
'BBGID',
'BBGID_composite',
'BSID',
'unique_id'])
def reduce_bsym_record(record):
"""Eliminate non-essential fields."""
return BSYMRecord._make((record.NAME,
record.ID_BB_SEC_NUM_DES,
record.FEED_SOURCE,
record.SECURITY_TYP,
record.MARKET_SECTOR_DES,
record.ID_BB_GLOBAL,
record.COMPOSITE_ID_BB_GLOBAL,
record.ID_BB_SEC_NUM_SRC,
record.ID_BB_UNIQUE))
좋아요. 꼬리말을 건너 뛰기 위해 DictReader에 필터를 추가해야했지만 제대로 작동했습니다. 감사. – MikeRand