2017-07-14 48 views
1

所以我有很多行看起来像这样的一个txt文件:txt文件蟒蛇唯一值

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

本质上讲,它是一个随机的学生主要和编码学期一年,他们才宣布它。我希望能够做的是在学期中读出每个独特的专业最初被宣布。从上面的行我需要:

2107:Business 

2117: Art 

2145: English 

我试图用Python中的熊猫做到这一点,但真的不能得到任何工作。 任何帮助表示赞赏?编辑: 应该澄清。我不希望代码在Art的第二个实例中读取。每个专业只有第一个声明和之前的学期。

+0

什么是最终结果的类型?只是弦乐? –

+0

字符串正常工作。我想作为最终结果的一个数据透视表将加密学生id作为数据透视表,下一列将显示3行,显示术语('2107','2117','2145')和最后一列以及相应的每个学期每行都有专业。 –

+0

然后字符串可能不是最好的选择。我想你会想要一个元组。这样数据更容易访问。 Blotosmetek的答案不应该太难以适应,但如果字符串适合你,那么你就是金。 –

回答

0

使用Python的CSV库来帮助将每一行分割成一列单元格。然后,您可以使用Python的grouper()配方是用来取n项目在同一时间里列表:

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) 

因此,对于您的示例文件中的行,这将给你:

2107: Business 
2117: Art 
2145: English 
+0

这看起来不错,但有没有办法只读第一个艺术的实例?所以最终的结果将是2107:商业,2117:艺术,2145:英语。 –

+0

您可以将每个主题添加到一个集合中,并在打印之前测试它是否在集合中。我已经相应地更新了脚本。 –

0

假设l包含一行 “像这样”:

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

您可以使用csv模块加载文件。例如:

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

现在你有一个文件中的所有列表rowrow[n] n的所有偶数值都是一年/学期,而n的所有奇数值都是主要的。