2017-07-14 14 views
1

だから私はこのように多くの行を持つテキストファイルがあります。TXTファイルパイソン一意の値

2107|Business|2117|Art|2137|Art|2145|English 

は基本的に、それは彼らがそれの前にそれを宣言することを主要なランダム学生やエンコード学期および年です。ユニークなメジャーが最初に宣言された学期に、私ができるようにしたいことを読んでいます。私が必要となる上行から:

2107:Business 

2117: Art 

2145: English 

私はPythonでパンダでこれを行うにしようとしましたが、実際に動作するように何かを得ることはできません。 何かお手伝いしましたか?

編集: 明確にする必要があります。私はアートの第2のインスタンスでコードを読むことを望んでいません。各専攻の前の最初の宣言と学期のみ。

a = l.split('|') 
for t in zip(a[0::2], a[1::2]): 
    print("{}: {}".format(*t)) 
+0

何最終結果のタイプですか?ただの文字列ですか? –

+0

文字列が正常に動作します。最終結果として暗号化された生徒IDをピボットとして使用するピボットテーブルがあり、次の列は用語( '2107'、 '2117'、 '2145')を示す3行、対応する各学期の各列の専攻科目 –

+0

おそらく、文字列はおそらく最善の策ではありません。私はタプルがほしいと思う。そうすれば、データへのアクセスがより簡単になります。 Blotosmetekの答えはあまりにもそれを行うには調整する必要はありません、そして文字列があなたのために働く場合、あなたは金色です。 –

答えて

0

PythonのCSVライブラリを使用して、各行をセルのリストに分割するのに役立ちます。これはあなたを与えるだろう、あなたの例のファイルの行のためにそう

import csv 
import itertools 

def grouper(iterable, n, fillvalue=None): 
    "Collect data into fixed-length chunks or blocks" 
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx 
    args = [iter(iterable)] * n 
    return itertools.izip_longest(fillvalue=fillvalue, *args) 

seen = set() 

with open('input3.txt', 'rb') as f_input: 
    for row in csv.reader(f_input, delimiter='|'): 
     for k, v in grouper(row, 2): 
      if v not in seen: 
       print "{}: {}".format(k, v) 
       seen.add(v) 

:あなたは、リストのうち、時nアイテムを取るために使用されているPythonのgrouper()レシピを利用することができます

2107: Business 
2117: Art 
2145: English 
+0

これはうまく見えますが、Artの最初のインスタンスだけを読む方法がありますか?最終的な出力は2107:Business、2117:Art、2145:Englishです。 –

+0

各サブジェクトをセットに追加し、印刷前にセットに含まれているかどうかをテストすることができます。私はそれに応じてスクリプトを更新しました。 –

0

は、 "このような" 行が含まれています。たとえば:

import csv 
    with open('file.txt', 'rb') as f: 
    reader = csv.reader(f, delimiter='|') 
    for row in reader: 
     print row 

は今、あなたは、ファイル内のすべてと、リストrowを持っています。 row[n]は、nのすべての偶数値が年/学期であり、nのすべての奇数値が大メジャーです。

0

あなたは、ファイルをロードするためにcsvモジュールを使用することができます:lと仮定すると