Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用脚本筛选文本文件_Python_Perl - Fatal编程技术网

Python 使用脚本筛选文本文件

Python 使用脚本筛选文本文件,python,perl,Python,Perl,我有一个非常大的以制表符分隔的文本文件。有些行在文件中具有相同的值,有些行只有唯一的值,例如: a foo a bar a foo2 b bar2 c bar2 c foo3 d bar3 ... a b d ... 我还有另一个ID列表文件,它只是整个列表的一部分。例如: a foo a bar a foo2 b bar2 c bar2 c foo3 d bar3 ... a b d ... 我想得到那些ID列表的对应值,ID列表

我有一个非常大的以制表符分隔的文本文件。有些行在文件中具有相同的值,有些行只有唯一的值,例如:

a   foo
a   bar
a   foo2
b   bar2
c   bar2
c   foo3
d   bar3
...
a
b
d
...
我还有另一个ID列表文件,它只是整个列表的一部分。例如:

a   foo
a   bar
a   foo2
b   bar2
c   bar2
c   foo3
d   bar3
...
a
b
d
...

我想得到那些ID列表的对应值,ID列表是唯一的。如何使用perl脚本、python或basic bash命令实现这一点?谢谢你

Quickie未经测试的Python:

ids = set()
with open('id-list.txt') as f:
    for line in f:
        ids.add(line.strip())
with open('data.txt') as f:
    for line in f:
        parts = line.strip().split('\t', 1)
        if parts[0] in ids:
            print line,

未经测试的快速Python:

ids = set()
with open('id-list.txt') as f:
    for line in f:
        ids.add(line.strip())
with open('data.txt') as f:
    for line in f:
        parts = line.strip().split('\t', 1)
        if parts[0] in ids:
            print line,

您还可以使用以下代码(确保应该重写代码(不创建列表和dict,只对找到的项目执行一些操作),尤其是在文件太大的情况下):

很抱歉,没有注意到id可能有多个值:

output = {}
for row in open('c:\\tst.txt','r'):
    if not row.strip():
        continue
    id, datavalue = row.strip().split()
    if not id in output:
        output[id] = []
    output[id].append(datavalue)
或使用:


您还可以使用以下代码(确保应该重写代码(不创建列表和dict,只对找到的项目执行一些操作),尤其是在文件太大的情况下):

很抱歉,没有注意到id可能有多个值:

output = {}
for row in open('c:\\tst.txt','r'):
    if not row.strip():
        continue
    id, datavalue = row.strip().split()
    if not id in output:
        output[id] = []
    output[id].append(datavalue)
或使用:

在perl中:

use strict;
use warnings;
use autodie;

open my $id_list, '<', 'id_list_file';
my %ids = map { chomp; $_ => 1 } readline $id_list;
close $id_list;

open my $text_file, '<', 'text_file';
while ( my $line = readline $text_file ) {
    chomp $line;
    my ($id, $value) = split /\t/, $line, 2;
    if ( $ids{ $id } ) {
        print "got value $value for id $id\n";
    }
}
使用严格;
使用警告;
使用自动模具;
在perl中打开我的$id_列表“:

use strict;
use warnings;
use autodie;

open my $id_list, '<', 'id_list_file';
my %ids = map { chomp; $_ => 1 } readline $id_list;
close $id_list;

open my $text_file, '<', 'text_file';
while ( my $line = readline $text_file ) {
    chomp $line;
    my ($id, $value) = split /\t/, $line, 2;
    if ( $ids{ $id } ) {
        print "got value $value for id $id\n";
    }
}
使用严格;
使用警告;
使用自动模具;
打开我的$id_列表,“快速查看您的id列表:

似乎
a
可以是
foo
bar
。第二列是唯一的,但不是第一列。但是,您的其他列表如下所示:

a
b
d
这似乎表明第一列(不是唯一的)是键。当我阅读第一个列表中的
a
时,应该返回什么。我是否同时返回
foo
bar
,还是这是一个错误

我需要知道这一点,然后才能给你答案


补遗
我需要把它们都还回去。很抱歉搞混了

好的,在Perl中,存储密钥信息的最简单方法是使用散列。散列的问题是每个键只有一个值。在文件中,情况并非如此,每个键有两个单独的值。有两种处理方法:

方法#1:将值附加到前一个值上 方法#2:存储哈希列表 这是一个危险的领域。它增加了混乱,我通常建议您在进入哈希列表或列表哈希等时考虑面向对象编程

open (ID_FILE, "id_file.txt")
    or die qq(Can't open "id_file.txt" for reading\n);
my %idHash;
while (my $line = <ID_FILE>) {
    chomp $line;
    my ($key, $value) = split("/s+", $line);
    push(@{$idHash{$line}}, $value);
}
close ID_FILE;
现在,当您进行查找时,您必须浏览以下列表:

open (ID_LIST, 'list_of_ids.txt')
    or die qq(Can't open "list_of_ids.txt" for reading\n);
while (my $line = <ID_LIST>) {
    chomp $line;
    my @tempList = \$idHash{$line};
    print "The values for key $line are " . join(", ", @tempList) . "\n";;
    print "The values for key $line are " . join(", ", @{$idHash{$line}) . "\n"; 
}
顺便说一句,很抱歉,由于时间不够,我还没有测试代码。因此,我可以保证到处都有语法错误和bug。但是,它确实让您大致了解了如何使用Perl哈希通过一个键快速提取一个值,以及如何为一个键存储多个值

看起来Python最初的答案也遇到了同样的问题。但是,修改后的ID看起来是正确的。

快速查看您的ID列表:

似乎
a
可以是
foo
bar
。第二列是唯一的,但不是第一列。但是,您的其他列表如下所示:

a
b
d
这似乎表明第一列(不是唯一的)是键。当我阅读第一个列表中的
a
时,应该返回什么。我是否同时返回
foo
bar
,还是这是一个错误

我需要知道这一点,然后才能给你答案


补遗
我需要把它们都还回去。很抱歉搞混了

好的,在Perl中,存储密钥信息的最简单方法是使用散列。散列的问题是每个键只有一个值。在文件中,情况并非如此,每个键有两个单独的值。有两种处理方法:

方法#1:将值附加到前一个值上 方法#2:存储哈希列表 这是一个危险的领域。它增加了混乱,我通常建议您在进入哈希列表或列表哈希等时考虑面向对象编程

open (ID_FILE, "id_file.txt")
    or die qq(Can't open "id_file.txt" for reading\n);
my %idHash;
while (my $line = <ID_FILE>) {
    chomp $line;
    my ($key, $value) = split("/s+", $line);
    push(@{$idHash{$line}}, $value);
}
close ID_FILE;
现在,当您进行查找时,您必须浏览以下列表:

open (ID_LIST, 'list_of_ids.txt')
    or die qq(Can't open "list_of_ids.txt" for reading\n);
while (my $line = <ID_LIST>) {
    chomp $line;
    my @tempList = \$idHash{$line};
    print "The values for key $line are " . join(", ", @tempList) . "\n";;
    print "The values for key $line are " . join(", ", @{$idHash{$line}) . "\n"; 
}
顺便说一句,很抱歉,由于时间不够,我还没有测试代码。因此,我可以保证到处都有语法错误和bug。但是,它确实让您大致了解了如何使用Perl哈希通过一个键快速提取一个值,以及如何为一个键存储多个值


看起来Python最初的答案也遇到了同样的问题。但是,修改后的文件看起来是正确的。

您可以通过读取第一个文件来创建哈希。将id作为键,并将相应值集的数组作为值。读取第二个文件时,只需在使用第一个文件创建的哈希中进行查找。

您可以通过读取第一个文件创建哈希。将id作为键,并将相应值集的数组作为值。在读取第二个文件时,只需在使用第一个文件创建的哈希中进行查找。

查看
grep-f
查看
grep-f
为什么可以使用id列表打印一个数据。我还想打印具有相同ID的所有结果。@Jianguo-如果第一个示例中的行为row.strip()',则在open('c:\\ids.txt','r')中使用'ids=[row.strip()'。为什么只可以使用ID列表打印一个数据。我还想打印具有相同ID的所有结果。@Jianguo-如果第一个示例中的行为row.strip()',则对打开的行('c:\\ids.txt','r')使用'ids=[row.strip()'。提取后是否需要关闭文件?您不需要,但为什么不需要?这使得以后在代码中不再使用它变得更加清晰。当我运行脚本时,不会发生任何事情。我遗漏了一些论点吗?你的地图看起来有点古怪。看起来您正在使用散列将整行用作
1
值的键,而不是将行拆分为键和值,并创建
$ids{$key}=$value
。我看错了吗?也许你是对的,我只是感到困惑。我很容易上当