我想从一个文本文件中提取一个列并删除重复项,最后得到一个具有唯一字符串的列—python

我想从一个文本文件中提取一个列并删除重复项,最后得到一个具有唯一字符串的列—python,python,duplicates,Python,Duplicates,我有一个由制表符和换行符分隔的文本文件。第一列包含示例ID,但这些ID是重复的: 1/16 info info info 1/16 info info info 2/16 info info info 2/16 info info info 2/16 info info info 3/16 info info info 3/16 info info info 我需要提取

我有一个由制表符和换行符分隔的文本文件。第一列包含示例ID,但这些ID是重复的:

1/16    info    info    info
1/16    info    info    info
2/16    info    info    info
2/16    info    info    info
2/16    info    info    info
3/16    info    info    info
3/16    info    info    info
我需要提取ID的第一列,这样我就得到了一列,即-

1/16
2/16
3/16
我已经成功地提取了列,但是我在删除重复项时遇到了困难?以下是我所拥有的:

path = ./Documents/*txt
for filename in glob.glob(path):
    my_file = open(filename, 'r+')
    for line in my_file:
        line = line.split('\t')
        id = line[0]
        print id
我尝试使用另一个列表并添加ID,然后

s=[]
if id not in s:
    s.append(id)

但是我被困在如何从这里删除副本上。

希望我能理解你想要什么, 但是,您只需使用

list(set(foo))
例如:

t = [1, 2, 3, 1, 2, 5, 6, 7, 8]
list(set(t))
[1, 2, 3, 5, 6, 7, 8]
list(set(t) - set(s))
[8, 5, 6, 7]

希望我明白你的意思, 但是,您只需使用

list(set(foo))
例如:

t = [1, 2, 3, 1, 2, 5, 6, 7, 8]
list(set(t))
[1, 2, 3, 5, 6, 7, 8]
list(set(t) - set(s))
[8, 5, 6, 7]
对于文件文本处理(如果使用linux),标准工具是更好的选择。 事实上,在你的情况下,你可以使用awk-like

# quick and dirty
import subprocess
def get_uniqid(path, suff):
    return set(subprocess.check_output(
        "awk '{print $1}' %s/*.%s | uniq" % (path, suff), shell=True).splitlines()) 
它将返回文件夹
path
中带有后缀
suff
的id集

用你的代码就行了

def get_ids():
    ids = []
    path = "./Documents/*txt"
    for filename in glob.glob(path):
        with open(filename, 'r') as fin:
            for line in fin:
                line = line.split('\t', maxsplit=2)
                id_ = line[0]
                if id_ not in ids:
                    ids.append(id_)
    return set(ids) # set removes duplicated not needed because of if id_ not in ids:
对于文件文本处理(如果使用linux),标准工具是更好的选择。 事实上,在你的情况下,你可以使用awk-like

# quick and dirty
import subprocess
def get_uniqid(path, suff):
    return set(subprocess.check_output(
        "awk '{print $1}' %s/*.%s | uniq" % (path, suff), shell=True).splitlines()) 
它将返回文件夹
path
中带有后缀
suff
的id集

用你的代码就行了

def get_ids():
    ids = []
    path = "./Documents/*txt"
    for filename in glob.glob(path):
        with open(filename, 'r') as fin:
            for line in fin:
                line = line.split('\t', maxsplit=2)
                id_ = line[0]
                if id_ not in ids:
                    ids.append(id_)
    return set(ids) # set removes duplicated not needed because of if id_ not in ids:

使用集合和集合理解假设您将选项卡作为分隔符:

print ({element.split("\t")[0] for element in set(open("sample.txt").readlines())})
输出:

>>>>
{'2/16', '1/16', '3/16'}

使用集合和集合理解假设您将选项卡作为分隔符:

print ({element.split("\t")[0] for element in set(open("sample.txt").readlines())})
输出:

>>>>
{'2/16', '1/16', '3/16'}

可能重复的可能重复的感谢我理解这一点,但我的问题是,我的ID“列表”不是一个列表。这是一组字符串。我认为如果你在这种情况下使用一个列表会容易得多:在你的示例中,只需将每个字符串附加到一个列表中,然后你就会有一个所有ID的列表,你可以用代码片段upYes删除重复项。我已经尝试过了。但是,当我尝试:lst=[]lst.append(id)时,我会在自己的列表中得到每个id吗?比如:[1/16][2/16]等等?我怎样才能改变这个?谢谢你的帮助:)你能发布你的完整代码吗?因为如果我添加一个空列表的声明,而不是在你的问题片段中打印append函数,我只得到一个正确的列表。您也可以在append:lst.append(str[0])过程中尝试,谢谢。我理解这一点,但我遇到的问题是,我的ID“列表”不是列表。这是一组字符串。我认为如果你在这种情况下使用一个列表会容易得多:在你的示例中,只需将每个字符串附加到一个列表中,然后你就会有一个所有ID的列表,你可以用代码片段upYes删除重复项。我已经尝试过了。但是,当我尝试:lst=[]lst.append(id)时,我会在自己的列表中得到每个id吗?比如:[1/16][2/16]等等?我怎样才能改变这个?谢谢你的帮助:)你能发布你的完整代码吗?因为如果我添加一个空列表的声明,而不是在你的问题片段中打印append函数,我只得到一个正确的列表。您也可以在追加期间尝试:lst.append(str[0])