2013-03-21 82 views
0

我想找出處理下列數據的最佳方法。我正在抓取一個網站,並使用文本(.prn)文件(打印文件,這是帶有我想要的數據的文件,我認爲這會比Adobe Acrobat文件更好)從中收集數據。我的問題是當我將數據帶入python時:數據一次只能在屏幕上垂直向下一個字母,所以即使有多行,這些數據也只是在一列上流入。我想知道是否有人會知道如何使數據進來,在一個更傳統的方式,我可以在行[0],行[1]等... 這是我的代碼,以防它有助於你也可以看到我嘗試過的其他一些功能)。格式化來自文本(.prn)文件的數據

import os 
import urllib 
import urllib2 
import string 
import sys 
import os 
from bs4 import BeautifulSoup 
import csv 
import mechanize 
from numpy import* 
import datetime 
import traceback 
from pylab import* 
site="http://www.treasurydirect.gov/govt/reports/pd/mspd/mspd.htm" 

br = mechanize.Browser() 
br.set_handle_equiv(False) 
br.open(site) 
print 'br.title',br.title() 
allforms = list(br.forms()) 
br.form = allforms[0] 
br.follow_link(text_regex="February", nr=0) 
#br.click_link(text='February', nr=0) # this works to 

#next page 
print br.title() 
allforms = list(br.forms()) 
print allforms 
br.form = allforms[0] 
getstuff=br.click_link(text="Text (.prn)", nr=0) # this works to 
#getstuff= br.click_link(text="Adobe Acrobat (.pdf)", nr=0) Adobe Acrobat (.pdf) 

br.open(getstuff) 


csvData=br.response().read() # use read to BeautifulSoup(x) 
#site = BeautifulSoup(csvData) 
#print site 
for row in csvData: 
print row[0] 

這裏是確切的網站頁面,文本(.PRT)文件是: http://www.treasurydirect.gov/govt/reports/pd/mspd/2013/2013_feb.htm

我試圖以處理文本(.PRN)下的數據摘要文件。 請給出處理數據的最佳方法的建議。

我使用python27,機械化,美麗的湯和urllib的

回答

0

閱讀的文本文件美麗的湯似乎給你csvData回一個字符串,並不像你期望的行列表。因此,迭代字符串會在每個迭代步驟返回一個字符。這就是爲什麼你的文字轉換爲單列。

首先,你好像根本不需要美麗的湯!您正在檢索文本文件,而不是HTML文件。 美麗的湯是一個HTML/XML解析器。另外機械化似乎對我沒有必要(我見過your previous question,但確實,你不需要解析HTML頁面來發現鏈接,因爲你已經知道最終的url)。

對我來說,你應該在三個部分分割算法:

  • 爲了獲取文本行的列表
  • 刪除不必要的行
  • 格式的行以適應你的目的

你的問題似乎主要與第一部分有關,但既然你也問如何檢索最終數據的建議,我想你還需要另外兩個:)

這裏是我的建議:讓我們開始定義

import urllib2, re 

def get_data_text(month, year): 
    """given a month and a year, this method returns the raw data file (as a list of rows)""" 
    url_pattern = 'http://www.treasurydirect.gov/govt/reports/pd/mspd/{year:4d}/opds{month:02d}{year:4d}.prn' 
    url = url_pattern.format(month=month, year=year) 
    source = urllib2.urlopen(url) 
    data = source.readlines() 
    source.close() 
    return data 


def keep_only_interesting_rows(data, interesting_rows): 
    """filter data rows in order to keep only the ones that start with strings in interesting_rows list""" 
    return [line for line in data if any([line.strip().startswith(ir) for ir in interesting_rows])] 


def convert_data_to_dict(data): 
    """converts every row in data to a dictionary element """ 
    return {re.sub('\.*\s*$', '', el[0:46]).strip():(int(el[47:63].replace(',','')), int(el[69:90].replace(',','')), int(el[95:115].replace(',',''))) for el in data} 

所以,現在我已經定義了三個功能,一是在我提出的解決方案各部分三大功能,一個用於算法的每個部分...。


如何使用這些功能?這裏有一個例子:

interesting_rows = ['Bills', 'Notes', 'Total Public Debt Outstanding'] # add the initial part of any row you are interested at (without leading spaces) 

mytext = get_data_text(2, 2013) # gets the text for feb, 2013 as rows 
data = keep_only_interesting_rows(mytext, interesting_rows) # filter rows 
final_data = convert_data_to_dict(data) # convert remaining rows into a dict 

print final_data 
print final_data['Bills'][2] # this gives you the third column 


# >>> {'Notes': (7416574, 5888, 7422462), 'Bills': (1738404, 3546, 1741950), 'Total Public Debt Outstanding': (11822436, 4864853, 16687289)} 
# >>> 1741950 


如果你想 ,無論出於何種原因,在你最初的文本文件訪問精確行(。PRN一個),你可以鍵入:

mytext = get_data_text(9, 2012) # this time let's get the text for September, 2012 
print mytext[0] 

返回:

MONTHLY STATEMENT OF THE PUBLIC DEBT 
+0

只想說,這是我收到過的最令人驚訝的答案,我從中學到了很多,仍然使用腳本上週到每月。謝謝furins – user1087809 2013-12-10 15:48:00

+0

你很好,讓我知道!我很高興我的回答幫助你! – furins 2013-12-12 16:03:19