Форум сайта python.su
							
  0  
								
								Доброго времени суток всем !
есть небольшая практическая задача…
есть толстый текстовой файл выдранный из пдф-а
содержащий отчет о расчетах, в нем есть значения , которые необходимо как-то вытащить и записать в виде пригодном для обработки
например запихнуть все в дбф-файл
из файла надо вытащить значения для конкретных стран 
начиная с Albania  5.99 и до конца страницы
 что из возможностей питона для этого надо и какая общая процедура обработки ?
файл примерно такого вида 
приведено одна страница но их намного!!! больше
Variable #:  58  Code:  ENEFF  Reference Year:  MRYA 1998-2002  
Description:  Energy efficiency  
Units:  Terajoules energy consumption per million dollars GDP (PPP)  
Source*:  US Energy Information Agency (EIA).  
Logic:  The more efficient an economy is, the less energy it needs to produce a given set of goods and services.  
Methodology:  The original data are in billion British Thermal Units (BTUs), which are converted to terajoules. The factor   
 applied to convert 10^9 BTUs to terajoules is .9478 (Source: Energy Information Administration). Total energy    
 consumption was normalized by GDP in million US dollars in purchasing power parities (PPPs).  
 Mean  8.17  Max  47.74  2.5   Percentile  1.04  
 Median  5.91  Min  0.24  97.5 Percentile  31.46  
 Albania  5.99  Ecuador  7.55  Lebanon  11.09  Saudi Arabia  17.60  
 Algeria  6.77  Egypt  8.80  Liberia    Senegal  3.84  
 Angola  4.30  El Salvador  3.57  Libya    Serbia and  Mont.    
 Argentina  5.66  Estonia  9.88  Lithuania  11.89  Sierra Leone  4.79  
 Armenia  15.96  Ethiopia  1.28  Macedonia  7.89  Slovakia  11.54  
 Australia  9.54  Finland  8.56  Madagascar  2.21  Slovenia  7.87  
 Austria  5.62  France  6.51  Malawi  3.40  South Africa  9.42  
 Azerbaijan  21.90  Gabon  4.18  Malaysia  9.94  South Korea  9.86  
 Bangladesh  2.34  Gambia  1.65  Mali  1.19  Spain  6.33  
 Belarus  19.93  Georgia  15.37  Mauritania  7.74  Sri Lanka  2.67  
 Belgium  9.08  Germany  6.04  Mexico  6.94  Sudan  2.37  
 Benin  3.54  Ghana  3.08  Moldova  24.88  Sweden  9.09  
 Bhutan    Greece  6.57  Mongolia  18.95  Switzerland  5.50  
 Bolivia  6.71  Guatemala  3.29  Morocco  3.86  Syria  13.21  
 Bosnia and Herz.    Guinea  1.37  Mozambique  4.93  Taiwan  11.28  
 Botswana  3.49  Guinea-Bissau  4.84  Myanmar    Tajikistan  35.43  
 Brazil  6.03  Guyana  6.79  Namibia  3.77  Tanzania  3.25  
 Bulgaria  14.21  Haiti  1.87  Nepal  1.72  Thailand  6.75  
 Burkina Faso  1.27  Honduras  5.38  Netherlands  7.90  Togo  2.37  
 Burundi  1.60  Hungary  7.33  New Zealand  9.72  Trin. and Tob.  38.67  
 Cambodia  0.30  Iceland  15.61  Nicaragua  4.44  Tunisia  4.84  
 Cameroon  2.47  India  4.73  Niger  1.78  Turkey  6.59  
 Canada  13.39  Indonesia  6.18  Nigeria  7.80  Turkmenistan  24.07  
 Central Afr. Rep.  1.19  Iran  12.68  North Korea    Uganda  1.01  
 Chad  0.34  Iraq    Norway  11.38  Ukraine  26.19  
 Chile  6.54  Ireland  4.16  Oman  10.11  United Arab. Em.  32.28  
 China  6.98  Israel  5.88  P. N. Guinea  3.56  United Kingdom  5.86  
 Colombia  4.12  Italy  4.76  Pakistan  6.17  United States  8.99  
 Congo  4.48  Jamaica  13.66  Panama  10.78  Uruguay  5.45  
 Costa Rica  4.19  Japan  6.07  Paraguay  14.67  Uzbekistan  47.74  
 Cфte d'Ivoire  3.95  Jordan  9.78  Peru  4.03  Venezuela  20.39  
 Croatia  7.80  Kazakhstan  22.63  Philippines  3.35  Viet Nam  4.46  
 Cuba    Kenya  4.62  Poland  7.77  Yemen  8.79  
 Czech Rep.  9.29  Kuwait  23.89  Portugal  5.50  Zambia  11.59  
 Dem. Rep. Congo  2.31  Kyrgyzstan  26.83  Romania  11.12  Zimbabwe  5.99  
 Denmark  4.75  Laos  3.98  Russia  21.93  
 Dominican Rep.  4.39  Latvia  8.43  Rwanda  1.25  
 
* Full source information for this variable can be found at the end of this Appendix.  Data in “” indicate imputed values; “..” means the data  
point is missing.2005 ESI: Appendix C    Variable Profiles  
 316
Офлайн
							
  0  
								
								Файл можно построчно считывать и с помощью регэкспов разбирать каждую строку, числа приводить для удобства к float и складывать это в базу(в sqlite например).
Офлайн
							
  41  
								
								
In : s = “Albania  5.99  Ecuador  7.55  Lebanon  11.09  Saudi_Arabia  17.60”
In : s
Out: ‘Albania  5.99  Ecuador  7.55  Lebanon  11.09  Saudi_Arabia  17.60’
In : s.split()
Out: 
['Albania',
 ‘5.99’,
 ‘Ecuador’,
 ‘7.55’,
 ‘Lebanon’,
 ‘11.09’,
 ‘Saudi_Arabia’,
 ‘17.60’]
In : s.split()
Out: 
In : s.split()
Out: 
что-то в таком духе, только вот что плохо, у тебя есть такие страны как ‘Saudi Arabia’,  термин 1, а слов 2=) поэтому над чёт думать
лучше конечно регекспами, но долго разбираться;)
Офлайн
							
  1  
								
								Хех, там еще у некоторых стран значения в квадратных скобках. В общем, без опыта с регулярными выражениями будет сложновато. Как я понимаю, еще дело в том, что параметры (эти самые GDP, PPP) тоже нужно разбирать… На твоем месте я бы обратился к кому-нибудь за подмогой (не в смысле советом, а в смысле “чтобы сделал”), причем здесь не принципиально, будет ли это на Perl, Python или TCL - один черт регэксп писать.
P.S. По фразе “например запихнуть все в дбф-файл” сразу чувствуется с чем работал раньше :lol:
Офлайн
							
  41  
								
								ну квадратные скобки можно удалить, filter всё что не string.letters блабла
просто думаю товарищ на регекспах загнётся)) я сам их не сильно люблю, обычно долго курю маны
Офлайн
							
  0  
								
								Да на чем здесь загибаться-то? Вот всего пару минут на написание этого потратил(data - это тестовый файл, с данными, но без инфы в заголовке. Ее вообщем-то тоже не сложно отрезать/пропарсить):
#!/usr/bin/python
import re
f = open('data', ‘r’)
patt = r'\s*(\w+?\s*\w*?)\s+\[?(+)\]?'
for i in f.readlines():
    print re.findall(patt, i)
Не самый похоже оптимальный вариант(регэксп лучше перед циклом скомпилять), но работает. А вообще всем советую почитать Фридла, чтоб проблем с регулярными выражениями меньше было.
P.S. 
Viet Nam 4.46:)
Офлайн