Чтение текста и присвоение класса данным в Python - PullRequest
0 голосов
/ 03 апреля 2012

Я искал вокруг, и мне не повезло найти что-нибудь, отвечающее на мой вопрос.

По сути, у меня есть файл со следующими данными:

Title - 19
Artist - Adele 
Year released - 2008
1 - Daydreamer, 3:41, 1
2 - Best for Last, 4:19, 5
3 - Chasing Pavements, 3:31, 7
4 - Cold Shoulder, 3:12, 3

Title - El Camino 
Artist - The Black Keys 
Year released - 2011 
1 - Lonely Boy, 3:13, 1 
2 - Run Right Back, 3:17, 10 

EOF 

Я знаю, как создавать классы и как назначать объект классу и значения для этого объекта, но я почти готов оторвать голову от того, как я должен обрабатывать текст. Из текста мне нужно создать заголовок для альбома и присвоить ему информацию об альбоме. Есть еще кое-что, кроме того, что нужно сделать, и есть еще строки, которые нужно прочитать, и я просто не знаю, с чего начать. Я нашел два файла "album.py" через Google, и я не мог понять, как применить решение к моему делу.

И да, это для школьного задания. Я немного покопался и нашел кое-что актуальное, но я просто не понимаю этого. Я новичок в программировании в целом, и я добился прогресса, но это, кажется, слишком далеко над моей головой.

Я знаю, что мог бы сократить это до списков, используя split (\ n \ n) и работая с последовательными постепенно уменьшающимися списками, но я пытаюсь избежать этого метода любой ценой.

EDIT:

Пока лучше предположить, что я ничего не знаю. Хотя, чтобы ответить на вопрос ниже: я могу открыть файл и прочитать его. Если это согласованный файл в формате CSV, я могу написать код для обработки вложенных данных и создать структуру класса, которая использует эти данные. Прямо сейчас у меня проблемы с первыми тремя строками и цифрами сразу ниже.

4 апреля 2012 г .:

Хорошо, у меня есть некоторый код, я оставил комментарии по этому поводу внизу.

def getInput():
    global albums
    raw = open("album.txt","r")
    infile = raw
    raw.close
    text=""
    line = infile.readline()
    while (line != "EOF\n" ):
        text += line
        line=infile.readline()
    text=text.rstrip("\n\n")
    albums=[str(n) for n in text.split("\n\n")]
    return albums


class Album():
    def __init__(self, title, artist, date):
        self.title=title
        self.artist=artist
        self.date=date
        self.track={}

    def addSong(self, TrackID, title, time, ranking):
        self.track+={self}

    def getAlbumLength(self):
        asdf=0
    def getRanking(self):
        asdf=0

def labels(x): #establishes labels per item to be used for Album Classifier
    title=""
    artist=""
    date=""

    for i in range(0,len(albums),1):
        sublist=[str(n) for n in albums[i].split("\n")]
        RANDUMB=len(albums[i])
        title=sublist[0]
        artist=sublist[1]
        date=sublist[2]

        for j in range(0,len(sublist),1):                
            song_info = [str(k) for k in sublist[3:].split("," and " - ")]
            TrackID=song_info[0]
            title=song_info[1]
            time=song_info[2]
            ranking=song_info[3]

getInput()
labels(albums)

Личные комментарии к коду: Я пытался избежать попадания в списки, потому что предвидел эту проблему. Что касается функций, я должен использовать каждую чертову, потому что это в требованиях к назначению ... Я недоволен, потому что я, вероятно, смог обойти их использование Код работает достаточно, за исключением последней части, где я пытаюсь взять информацию о песне. Я хочу разбить информацию о песне на списки, которые вложены в список информации об альбоме. Что-то вроде:

[Album title, Artist, Date released,[01,Song,3:44,2],[02,Song,0:01,9]....]

Текущий код дает мне ошибку индекса вне диапазона на данный момент ... Я использую python3.

TLDR. Таким образом, суть моей проблемы изменилась: попытка решить, как приступить к решению проблемы, - как взять элементы в списке и преобразовать их во вложенные списки.

1 Ответ

0 голосов
/ 03 апреля 2012

Если вы отредактируете свой вопрос, чтобы он содержал более конкретные примеры того, что доставляет вам неприятности, я отредактирую этот ответ.Но чтобы ответить на ваш общий вопрос, есть несколько шагов, необходимых для достижения вашей цели.

  1. Как вы сказали, вам нужно написать класс, который отражает структуру, которую вы намереваетесь создать из этих данных.
  2. Вам нужно будет проанализировать этот файл, возможно построчно.Таким образом, вы должны определить, является ли этот формат файла постоянным.Если это так, то вам нужно определить:
    1. Каков разделитель между каждым набором данных, который будет соответствовать экземпляру класса?
    2. Что такоеразделитель между каждым полем каждой строки?

Когда вы будете циклически проходить по каждой строке, вы будете знать, что вам нужно запускать новый объект альбома всякий раз, когда вы сталкиваетесь с пустой строкой.

Когда вы знаете, что начинаете новый альбом, вы можете предположить, что первая строка будет заголовком, вторая - исполнителем, третьим, годом и т. Д.

Для каждого изВ этих строках у вас также должны быть правила того, как разбить каждую из них на нужные вам данные.На базовом уровне это может быть простой набор разбиений.На более продвинутом уровне вы можете определить регулярные выражения для каждого типа линий.

...