2013-03-21 2 views
0

Я пытаюсь найти лучший способ обработки следующих данных. Я очищаю сайт и использую файл Text (.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. Beautiful Soup - это синтаксический анализатор HTML/XML. Также mechanize кажется ненужным для меня (я видел 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 


, если вы хотите, по какой-либо причине, доступ к точной строке в вашем начальном текстовом файле (.ргп один) вы можете ввести:

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

+0

Вы очень любезны, чтобы сообщить мне об этом! Я рад, что мой ответ помог вам! – furins

Смежные вопросы