2012-04-03 186 views
0

我一直在寻找周围的分配类的数据,并没有运气找到任何回答我的问题。阅读文本并在Python

基本上我有以下数据的文件:

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 

我知道如何创建类,以及如何将对象分配到类和值到该对象,但我只是准备把我的头发撕掉,我应该如何处理文本。从文本中,我需要为相册创建一个标题,并为其分配相册的信息。除此之外还有更多的事情需要完成,还有更多的线路需要阅读,而我只是不知道从哪里开始。我通过google发现了两个“album.py”文件,而且我一直无法对如何将解决方案应用于我的案例做出正面或反面的评论。

是的,这是一所学校分配。我做了一些挖掘,发现了一些相关的东西,但我只是不理解它。我对编程一般都很陌生,而且我已经取得了进步,但是这似乎太过头了。

我知道我会这样减少采用分体式(\ 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:我的问题的实质也由此从试图解决如何去启动的解决方案如何采取列表中的项目,并将其转换成嵌套的列表一个变化。

+3

也许你可以发布你到目前为止?究竟哪一部分你有麻烦?打开一个文件阅读?如何读取文件中的行?如何创建相册类?如何为类变量赋值? – fitzgeraldsteele 2012-04-03 01:47:50

+0

你为什么害怕在名单上分裂? '\ n \ n'是迄今为止我可以看到的* only *分隔符。如果你不分裂两条换行符,你将如何划分一个对象的开始和另一个对象的结束? – mvanveen 2012-04-03 02:14:17

回答

0

如果你最终编辑你的问题包含的是什么给你的麻烦了一些更具体的例子,我将编辑这个答案。但为了解决您的一般问题,您需要采取一些步骤来实现您的目标。

  1. 就像你说的,你需要编写一个反映你想从这些数据中获得的结构的类。
  2. 您将需要通过线来分析此文件,可能行。所以你必须确定这个文件格式是否一致。如果是,那么你需要确定:
    1. 什么是每个之间的分隔符设置数据的,将被塑型为一个类的实例?
    2. 每行的每个字段之间的分隔符是什么?

当你遍历每一行,你会知道你需要时,你会遇到一个空行,开始了新专辑的对象。

当你知道你正在开始一个新的专辑,你可以假设第一行是标题,第二个艺术家,第三年,等

对于这些线你会的还必须有如何将每个分割成你想要的数据的规则。在基本层面上,它可以是一组简单的分割。在更高级的层次上,您可以为每种类型的行定义正则表达式。

+0

@ jdi谢谢你,这就是我一直在寻找的。我不想添加太多的信息,因为我没有对我所知道的事情做出假设,因为我可能是错的。 我的问题正是我不知道如何分割数据。我假设它是通过 .split(“\ n \ n”)。我想我会在实际的标题/艺术家/年份之前删除主要文本,但即使如此,我也不知道如何处理。我会提供我的代码 我会告诉你我的代码,但我到目前为止所做的只是读取文件,存储数据并关闭文件。 – 2012-04-03 02:17:34

+0

@T_Poda:你不需要一次读取整个数据。只需逐行循环,并随时更改“状态”。如果你打了一个空行,你就知道你需要制作一个新的。如果你最终发布任何代码,我会对此发表评论。 – jdi 2012-04-03 02:20:44