读取文本并在Python中为数据分配类

时间:2012-04-03 01:45:08

标签: python class readfile

我一直在寻找,并且没有找到回答我问题的任何事情。

基本上我有一个包含以下数据的文件:

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”文件,而且我无法对如何将解决方案应用到我的案例中做出正面或反面。

是的,这是一个学校作业。我做了一些挖掘并找到了一些相关的东西,但我只是不理解它。我是一般的编程新手,我已经取得了进步,但这似乎太过分了。

我知道我可以使用split(\ n \ n)将其缩减为列表并在一系列逐渐变小的列表上运行,但我试图不惜一切代价避免使用此方法。

编辑:

目前,最好假设我什么都不知道。虽然,回答下面的问题:我可以打开文件并阅读它。如果它是一致的CSV格式文件,我可以编写代码来处理所附数据,并创建一个使用该数据的类结构。现在我只是遇到了前三行的问题,以及下面的数字。

2012年4月4日:

好的,我有一些代码,我已经留下了关于它的评论。

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 :(得分:0)

如果你最后编辑你的问题以包含一些更具体的例子来解释你的问题,我将编辑这个答案。但是为了解决您的一般性问题,实现目标需要采取一些措施。

  1. 就像你说的那样,你需要编写一个反映你想从这个数据中获得的结构的类。
  2. 您可能需要逐行解析此文件。因此,您必须确定此文件格式是否一致。如果是,那么你需要确定:
    1. 每个 set 数据之间的分隔符是什么,它将符合类实例?
    2. 每行的每个字段之间的分隔符是什么?
  3. 当你在每一行上循环时,你会发现只要遇到一个空行就需要开始一个新的专辑对象。

    当您知道自己正在开始新专辑时,您可以假设第一行是标题,第二行是艺术家,第三行是年份等。

    对于这些行中的每一行,您还必须具有如何将每个行拆分为所需数据的规则。在基本级别,它可以是一组简单的分裂。在更高级别,您可以为每种类型的行定义正则表达式。