从python中的文件解析列后获取唯一元素

时间:2017-05-11 06:21:52

标签: python filehandle

我正在使用Python 3.6。我有一个由5列和>组成的tsv文件。 100k行。我已经使用split函数通过分隔符来解析文件,我从该分隔符接收带索引的特定列。我正在处理的专栏如下:

CSF3R
DNMT3A
DNMT3A
DNMT3A
DNMT3A
CBLB
PDGFRA
KIT
TET2
TET2
CUX1
CUX1
CUX1
CUX1
CUX1
CUX1
CUX1
CUX1
EZH2
EZH2
RAD21
ABL1
NOTCH1
NOTCH1
ETV6
ETV6
ETV6
FLT3
FLT3
TP53
TP53

我需要做的是获取此列中的所有独特元素,并仅打印其中一个元素。 我已经尝试了很多函数,比如join,set,试图跟随很多其他的stackoverflow帖子但是没有一个能真正解决我的问题。

另外,我收到的数据是'str'格式而不是列表。因此,我尝试将所有这些列表都放在列表中,但也没有这样做。 我无法使用python pandas,因为我的所有同事对包都没有任何想法。

因此我尝试的正常程序导向代码是:

file=open('filename.txt')
next(file)
    stripped=()
    pos=()
    s="-"

    for line in file:
        stripped=line.strip()
        pos=stripped.split("\t")

        pos[2]= [y for y in (x.strip() for x in pos[2].splitlines()) if y]
        print(pos[2])

输出提供了所有字符串的列表,即每个字符串都包含在单独的列表中,而不是单个列表中。

从上面的列表中,我的预期输出是:

CSF3R
DNMT3A
CBLB
PDGFRA
KIT
TET2
CUX1
EZH2
RAD21
ABL1
NOTCH1
ETV6
FLT3
TP53

这只给了我独特的元素。

要获得独特的元素,我是否必须将所有这些元素放在一个列表中,或者还有其他更好的方法吗?

我正在处理的file

4 个答案:

答案 0 :(得分:1)

从这个答案reading a text file columnwise and storing in a list in python

with open('test.txt', 'r') as file:
    rows = [[str(x) for x in line.split('\t')] for line in file]
    cols = [list(col) for col in zip(*rows)]

for i in cols:
    print(set(i))

答案 1 :(得分:1)

filename = "path/to/Post.txt"

with open(filename) as f:
    header = next(f)
    col = 2                                                # gene column
    unique_genes = {line.split()[col] for line in f.readlines()}

print(unique_genes)
# {'KIT', 'PDGFRA', 'CUX1', 'CBLB', 'DNMT3A', 'RAD21', 'CSF3R', 'NOTCH1', 'GENE', 'ABL1', 'TET2', 'EZH2'}

从数据中的第3列获取唯一项目的步骤如下:

  1. 打开文件(with
  2. 略过标题(next()
  3. 迭代文件的行(readlines)
  4. 按默认分隔符分割线条,例如标签(\t
  5. 仅从第三列([col]
  6. 中提取数据
  7. 在提取的数据上返回唯一值(set comprehension,{...})。
  8. 安全关闭文件(with
  9. 通过更改col值来选择其他列。

答案 2 :(得分:0)

要将文件转换为字符串列表,每行使用一个:

with open('filename.txt') as f:
    list_from_file = [x.strip() for x in f.readlines()]

print(set(list_from_file))

对于以制表符分隔的五列文件,请尝试:

with open('file1') as f:
    col1, col2, col3, col4, col5 = zip(
        *(y.split('\t') for y in (x.strip() for x in f.readlines())))

然后,您可以在所需的列

上使用set()

答案 3 :(得分:0)

我认为最简单的方法就是使用套装。由于您目前正在使用列表列表:[[CSF3R],[DNMT3A],[DNMT3A], ...],您将无法使用集合。如果您将文本文件解析为单个字符串列表:[CSF3R, DNMT3A, DNMT3A, ...],您将能够实现一个集 - 问题已解决!

您可以查看上面的实现以获取帮助。 此外,如果您需要更好的帮助,只需发布​​文本文件的格式,以便其他人可以浏览并找到更好的解决方案。

一切顺利