【问题标题】:Get line from file at specified byte offset从文件中获取指定字节偏移量的行
【发布时间】:2012-11-30 10:00:54
【问题描述】:

我有一个包含一堆行的文件。我有一个与每行开头对应的字节偏移量列表。我想要与字节偏移量相对应的每一行。有没有办法在 unix、perl 或 python 中做到这一点?我必须以比描述的更大的规模来做这件事。

文件:

abcd
bcde
cdef

字节偏移量:

0
10

期望的输出:

abcd
cdef

【问题讨论】:

  • +1 不仅是为了对抗路过的投票。这显然是一个编程问题。

标签: python perl parsing unix


【解决方案1】:
with open(filename, 'r') as f:    
    for offset in offsets:
        f.seek(offset)
        print(f.readline())

参考资料:

【讨论】:

  • 谢谢,我最终得到:f = open(filename, 'r') offsets = [0,10] 偏移量:f.seek(offset) print f.readline()。剥离()
【解决方案2】:

快速perl:

my @offsets = ( 0, 10 );

open (my $data, '<', 'file.txt') || die "Can't open input: $!\n";

foreach my $offset (@offsets) 
{
    seek( $data, $offset, 0 );
    my $line = <$data>;
    print $line;
}

close $data;

【讨论】:

  • +1,但强烈推荐 open my $fh, '&lt;', 'file.txt' 而不是使用裸文件句柄。
【解决方案3】:

seek() 到所需的字节位置,然后读取。这对 Python 和 Perl 来说应该很容易,并且可以通过 shell 脚本来实现(我在想dd)。

【讨论】:

  • tail -c +$OFFSET 寻找,然后head -n 1 只获得第一行。
  • 是的,应该这样做。这有点痛苦,所以我会选择一种脚本语言。你甚至可以在 Awk 中做到这一点。如果所需行的分布不是很稀疏,则读取和丢弃不需要的行甚至可能比重复查找更快。
  • 您可以在sh 中进行操作。我认为这类似于 shell 脚本中的tail -c +$2 $1 | head -n 1,并说cat byte-offsets.file | xargs -n 1 yourscript.sh lines.file
【解决方案4】:

当我结束时(感谢 unutbu)

#!/usr/bin/python
f = open(file_name, 'r')
offsets = [0,10]
for offset in offsets:
    f.seek(offset)
    print f.readline().strip()

【讨论】:

    【解决方案5】:

    应该这样做。

    def get_lines_by_offset(filename, *offsets):
        with open(filename, "r") as fp:
            results = []
            for offset in offsets:
                fp.seek(offset)
                results.append(fp.readline().strip())
        return results
    

    【讨论】:

      猜你喜欢
      • 2014-04-03
      • 1970-01-01
      • 2016-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-03
      • 1970-01-01
      • 2013-09-25
      相关资源
      最近更新 更多