从 python 中的文件解析列后获取唯一元素
Get unique elements after parsing a column from a file in python
我正在使用 Python 3.6。我有一个 tsv 文件,它包含 5 列和 > 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
我需要做的是获取此列中存在的所有唯一元素并仅打印其中一个。
我尝试了很多功能,例如加入、设置,尝试关注许多其他 Whosebug 帖子,但 none 确实解决了我的问题。
而且我收到的数据是 '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。
来自这个回答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))
要将文件转换为字符串列表,每行一个,请使用:
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()
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 列获取唯一项的步骤如下:
- 打开文件(
with
)
- 跳过 header (
next()
)
- 遍历文件的行 (
readlines)
- 按默认分隔符拆分行,例如选项卡 (
\t
)
- 只提取第三列的数据(
[col]
)
- Return 提取数据的唯一值(集合理解,
{...}
)。
- 安全关闭文件(
with
)
通过更改 col
值 Select 不同的列。
我认为最简单的方法肯定是使用集合。由于您当前使用的是列表列表:[[CSF3R],[DNMT3A],[DNMT3A], ...]
,您将无法使用集合。如果您将文本文件解析为单个字符串列表:[CSF3R, DNMT3A, DNMT3A, ...]
,您将能够实现一个集合 - 问题已解决!
你可以看看上面的实现来寻求帮助。
此外,如果您需要更好的帮助,只需 post 您的文本文件的格式,这样其他人就可以四处寻找,也许会找到更好的解决方案。
祝一切顺利
我正在使用 Python 3.6。我有一个 tsv 文件,它包含 5 列和 > 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
我需要做的是获取此列中存在的所有唯一元素并仅打印其中一个。 我尝试了很多功能,例如加入、设置,尝试关注许多其他 Whosebug 帖子,但 none 确实解决了我的问题。
而且我收到的数据是 '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。
来自这个回答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))
要将文件转换为字符串列表,每行一个,请使用:
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()
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 列获取唯一项的步骤如下:
- 打开文件(
with
) - 跳过 header (
next()
) - 遍历文件的行 (
readlines)
- 按默认分隔符拆分行,例如选项卡 (
\t
) - 只提取第三列的数据(
[col]
) - Return 提取数据的唯一值(集合理解,
{...}
)。 - 安全关闭文件(
with
)
col
值 Select 不同的列。
我认为最简单的方法肯定是使用集合。由于您当前使用的是列表列表:[[CSF3R],[DNMT3A],[DNMT3A], ...]
,您将无法使用集合。如果您将文本文件解析为单个字符串列表:[CSF3R, DNMT3A, DNMT3A, ...]
,您将能够实现一个集合 - 问题已解决!
你可以看看上面的实现来寻求帮助。 此外,如果您需要更好的帮助,只需 post 您的文本文件的格式,这样其他人就可以四处寻找,也许会找到更好的解决方案。
祝一切顺利