использование urllib для импорта форматированного текстового файла со строками из столбца - PullRequest
0 голосов
/ 17 июня 2011

Я пытаюсь использовать urllib для анализа текстового файла с веб-сайта и получения данных.Есть и другие файлы, которые я смог сделать, они отформатированы в виде столбцов, но этот вид меня отбрасывает из-за того, что строка для Южного Иллинойса-Эдвардсвилля выталкивает второй счет и местоположение из столбца.

file = urllib.urlopen('http://www.boydsworld.com/cgi/scores.pl?team1=all&team2=all&firstyear=2011&lastyear=2011&format=Text&submit=Fetch')

for line in file:
    game_month = line[0:1].rstrip()
    game_day   = line[2:4].rstrip()
    game_year  = line[5:9].rstrip()
    team1      = line[11:37].rstrip()
    team1_scr  = line[38:40].rstrip()
    team2      = line[42:68].rstrip()
    team2_scor = line[68:70].rstrip()
    extra_info = line[72:100].rstrip()

Линия Южный Иллинойс-Эдвардсвилл импортирует 'il' как team2_scr и импортирует '4 @Central Arkansas' в качестве extra_info.

Ответы [ 4 ]

2 голосов
/ 17 июня 2011

Хотите увидеть лучшее решение? http://www.boydsworld.com/cgi/scores.pl?team1=all&team2=all&firstyear=2011&lastyear=2011&format=CSV&submit=Fetch даст вам хороший CSV-файл, темная магия не нужна.

0 голосов
/ 17 июня 2011

вы хотите что-то вроде этого:

def get_row(row):
    row=row.split()
    num_pos=[]
    for i in range(len(row)):
        try:
            int(row[i])
            num_pos.append(i)
        except:
            pass
    assert(len(num_pos)==2)
    ans=[]
    ans.append(row[0])
    ans.append("".join(row[1:num_pos[0]]))
    ans.append(int(row[num_pos[0]]))
    ans.append("".join(row[num_pos[0]+1:num_pos[1]]))
    ans.append(int(row[num_pos[1]]))
    ans.append("".join(row[num_pos[1]+1:]))
    return ans


row1="2/18/2011  Central Arkansas           5  Southern Illinois-Edwardsville  4  @Central Arkansas"
row2="2/18/2011  Central Florida           11  Siena                      1  @Central Florida"

print get_row(row1)
print get_row(row2)

вывод:

['2/18/2011', 'CentralArkansas', 5, 'SouthernIllinois-Edwardsville', 4, '@CentralArkansas']
['2/18/2011', 'CentralFlorida', 11, 'Siena', 1, '@CentralFlorida']
0 голосов
/ 17 июня 2011

Очевидно, вам просто нужно разделить на несколько пробелов.К сожалению, модуль csv допускает только односимвольный разделитель, но re.sub может помочь.Я бы порекомендовал что-то вроде этого:

import urllib2
import csv
import re

u = urllib2.urlopen('http://www.boydsworld.com/cgi/scores.pl?team1=all&team2=all&firstyear=2011&lastyear=2011&format=Text&submit=Fetch')

reader = csv.DictReader((re.sub(' {2,}', '\t', line) for line in u), delimiter='\t', fieldnames=('date', 'team1', 'team1_score', 'team2', 'team2_score', 'extra_info'))

for i, row in enumerate(reader):
    if i == 5: break  # Only do five (otherwise you don't need ``enumerate()``)
    print row

Это дает такие результаты:

{'team1': 'Air Force', 'team2': 'Missouri State', 'date': '2/18/2011', 'team2_score': '2', 'team1_score': '7', 'extra_info': '@neutral'}
{'team1': 'Akron', 'team2': 'Lamar', 'date': '2/18/2011', 'team2_score': '1', 'team1_score': '2', 'extra_info': '@neutral'}
{'team1': 'Alabama', 'team2': 'Alcorn State', 'date': '2/18/2011', 'team2_score': '0', 'team1_score': '11', 'extra_info': '@Alabama'}
{'team1': 'Alabama State', 'team2': 'Tuskegee', 'date': '2/18/2011', 'team2_score': '5', 'team1_score': '9', 'extra_info': '@Alabama State'}
{'team1': 'Appalachian State', 'team2': 'Maryland-Eastern Shore', 'date': '2/18/2011', 'team2_score': '0', 'team1_score': '4', 'extra_info': '@Appalachian State'}

Или, если вы предпочитаете, просто используйте cvs.reader и получите list s вместоdict с:

reader = csv.reader((re.sub(' {2,}', '\t', line) for line in u), delimiter='\t')

print reader.next()
0 голосов
/ 17 июня 2011

Скажите, что s содержит одну строку вашей таблицы.Тогда вы могли бы использовать метод split () библиотеки re (регулярные выражения):

import re
rexp = re.compile('  +')  # Match two or more spaces
cols = rexp.split(s)

... и теперь cols - это список строк, каждый столбец в строке таблицы.Это предполагает, что столбцы таблицы разделены как минимум двумя пробелами, и ничем иным.Если это не так, аргумент re.compile () может быть отредактирован, чтобы учесть другие конфигурации.

Напомним, что Python рассматривает файл как последовательность строк, разделенных символами новой строки.Поэтому все, что вам нужно сделать, - это за цикл для вашего файла, применяя .split () к каждой строке.

Для еще более приятного решения, проверьте встроенную функцию map () и попробуйте использовать ее вместо цикла for.

...