2012-08-30 3 views
0

고급 모드에서 파일을 읽고 싶습니다.파일 읽기 파이썬

첫째 :

이 파일에서, 나는 코드가 내가 문자열 [data] 나타날 때까지의 단계를 읽고 어떻게, 따라가있는 특정 단계가 있습니다. 둘째

[Steps] 
step1 = WebAddress 
step2 = Tab 
step3 = SecurityType 
step4 = Criteria 
step5 = Date 
step6 = Click1 
step7 = Results 
step8 = Download 
[data] 
...... 

: 나는 [자료] 결국 모든 것을 읽을 수있는 방법 .

[data] 
WebAddress___________________________ Destination___________ Tab_____________ SecurityType___________________________________________________ Criteria___ Date_______ Click1_ Results_ Download  
https://mbsdisclosure.fanniemae.com/ q:\\%s\\raw\\fnmapool Advanced Search Interim MBS: Single-Family          Issue Date 09/01/2012 Search 100  CSV XML 
https://mbsdisclosure.fanniemae.com/ q:\\%s\\raw\\fnmapool Advanced Search Preliminary Mega: Fannie Mae/Ginnie Mae backed Adjustable Rate Issue Date 09/01/2012 Search 100  CSV XML 
https://mbsdisclosure.fanniemae.com/ q:\\%s\\raw\\fnmapool Advanced Search Preliminary Mega: Fannie Mae/Ginnie Mae backed Fixed Rate  Issue Date 09/01/2012 Search 100  CSV XML 

나는 단계는 단계가 될 수있는 (예를 들면. WebAddress)이 step____________________에서 모든 것을 전달하려는. 예를 들어 step1 = WebAddress 인 경우 WebAddress__________________________ 등의 모든 내용을 읽는 방법은 무엇입니까? 감사!

+0

파일의 크기는 어느 정도입니까? 한 번에 모든 것을 메모리에서 읽지 않으려는 곳에 충분히 큰가요? –

+0

별로 크지는 않지만 어쩌면 어쩌면 1MB에 도달 할 것입니다. –

+0

루프를 사용해 보았지만 너무 지루합니다. –

답변

0

첫째 :

with open(file_name) as f: 
     print (f.read()).split("[data]") 

둘째 : 그

을이 안된 탭 경우

with open(file_name) as f: 
     pre_data,post_data =[s.strip() for s in (f.read()).split("[data]")] 
post_data_lines = post_data.splitlines() 
headers = post_data_lines[0].split() 
print headers 
for line in post_data_lines[1:]: 
     print line.split() 
     print dict(zip(headers,line.split())) 

필자도 확실하지 않은 당신의 [데이터] 구분하는 방법을 당신이 line.split('\t')을 할 수 있습니다 ... 하지만 그것은 작동해야하고 그것은 당신이 원하는 곳까지 당신을 얻지 만 적어도 그것이 당신이 원하는 것 대부분을 얻습니다 ("하드"파트)

file_name = "testdata.txt" 
with open(file_name) as f: 
     pre_data,post_data =[s.strip() for s in (f.read()).split("[data]")] 
post_data_lines = post_data.splitlines() 
headers = post_data_lines[0].split() 

for line in post_data_lines[1:]: 
    tmpline = [] 
    pos = 0 
    for itm in headers: 
     tmpline.append(line[pos:pos+len(itm)]) 
     pos += len(itm)+1 

    print dict(zip(headers,tmpline)) 

를 사용하는 헤더 폭으로 분할하고 __ 년대 밖으로 실제 헤더를 원하는 경우 다음

file_name = "testdata.txt" 
with open(file_name) as f: 
     pre_data,post_data =[s.strip() for s in (f.read()).split("[data]")] 
post_data_lines = post_data.splitlines() 
headers = post_data_lines[0].split() 
headers2 = [s.replace("_"," ").strip() for s in headers] 
for line in post_data_lines[1:]: 
    tmpline = [] 
    pos = 0 
    for itm in headers: 
     tmpline.append(line[pos:pos+len(itm)]) 
     pos += len(itm)+1 

    print dict(zip(headers2,tmpline)) 
+0

두 번째 부분은 작동하지 않습니다. '헤더'아래에있는 모든 내용을 읽지는 않으며 하나의 문자 만 제공합니다. –

+0

고정 ... 죄송합니다 –

+0

아직 작동하지 않습니다 :/ –

0

첫 단계 사용 :

>>> import ConfigParser 
>>> cfg = ConfigParser.RawConfigParser() 
>>> with open('sample.cfg') as f: 
...  cfg.readfp(f) 
... 
>>> cfg.get('Steps','step1') 
'WebAddress' 

을 두 번째 단계 :

>>> data_section = '' 
>>> with open('sample.cfg') as f: 
... data_section = f.read() 
... 
>>> data = data_section[data_section.index('[data]')+len('[data]')+1:] 
>>> reader = csv.reader(io.BytesIO(data),delimiter='\t') 
>>> reader.next() # skips header 
>>> results = [row for for row in reader] 

결과는 목록의 목록이며 각 내부 목록에는 데이터 섹션의 항목이 있습니다.

[['https://mbsdisclosure.fanniemae.com/','q:\\\\%s\\\\raw\\\\fnmapool','Advanced Search', 'Interim MBS: Single-Family', 'Issue Date','09/01/2012','Search','100', 'CSV XML']...]