2012-04-03 4 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経由で2つの "album.py"ファイルを見つけました。私の場合にソリューションを適用する方法の頭や尾を作ることができませんでした。

はい、これは学校の割り当てのためです。私はいくつかの掘り出し物を行い、関連性のあるものを見つけましたが、私はそれを理解していません。私は一般的にプログラミングには新しく、進歩しましたが、これは私の頭をはるかに超えているようです。

スプリット(\ n \ n)を使用してリストを縮小し、徐々に小さいリストのシリーズで操作することができますが、この方法を無駄にしないようにしようとしています。

EDIT:

当分の間、それは私が何も知らないと仮定するのが最善です。しかし、以下の質問に答えるには:ファイルを開いて読むことができます。一貫性のあるCSV形式のファイルであれば、囲まれたデータを処理するコードを記述し、そのデータを使用するクラス構造を作成できます。今は、最初の3行とすぐ下の数字に問題があります。

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

+0

なぜあなたはリストを分割するのを恐れていますか? '\ n \ n'はこれまで見てきた*のみのデリミタです。 2つの改行で分割しない場合は、どのようにして1つのオブジェクトの始まりと別のオブジェクトの終わりを区切りますか? – mvanveen

答えて

0

問題を解決するための具体的な例を含むように質問を編集すると、この回答が編集されます。しかし、あなたの一般的な質問に答えるために、あなたの目標を達成するためのいくつかのステップがあります。

  1. あなたが言ったように、このデータから得ようとしている構造を反映するクラスを書く必要があります。
  2. このファイルは、おそらく1行ずつ解析する必要があります。したがって、このファイル形式が一貫しているかどうかを判断する必要があります。そうである場合、あなたは決定する必要があります:
    1. のクラスインスタンスに準拠するそれぞれの間の区切り文字は何ですか?
    2. 各行の各フィールド間の区切り文字は何ですか?あなたは各行をループしている場合

、あなたはあなたが空白行が発生した時はいつでも新しいアルバムのオブジェクトを起動する必要があることを知っているだろう。これらの線のそれぞれについて

あなたが新しいアルバムを始めて知ったとき、あなたは最初の行がタイトルになると仮定することができ、二等のアーティスト、三年、

必要になりますそれぞれのデータを必要なデータに分割する方法のルールも必要です。基本的なレベルでは、単純な分割のセットにすることができます。より高度なレベルでは、各タイプの行に対して正規表現を定義することができます。

+0

@ jdiありがとう、これは私が探していたものです。私は間違っている可能性があるので、私が知っていることを前提にしていないという事実のために、あまりにも多くの情報を追加したくない。 私の問題はちょうどデータをどのように分割するのか分かりません。私はそれがの.split( "\ n \ n")であると仮定します。私は、実際のタイトル/アーティスト/年の前に先行するテキストを取り除くことを前提としていますが、これを処理する方法はわかりません。私は自分のコードを提示したい 私は自分のコードを見せたいが、これまでにやっているのは、ファイルを読み込んで、データを保存し、ファイルを閉じることだけだ。 –

+0

@T_Poda:データ全体を一度に読む必要はありません。行ごとにループして、あなたの "状態"を変えてください。空白行を押すと、新しい行を作成する必要があることがわかります。あなたがコードを投稿し終えると、私はそれについてコメントします。 – jdi

関連する問題