gpt4 book ai didi

python - 如何使用 python 优雅地按部分组合/连接文件?

转载 作者:太空宇宙 更新时间:2023-11-04 01:29:31 25 4
gpt4 key购买 nike

就像我之前的许多不幸的程序员灵魂一样,我目前正在处理一种拒绝消亡的古老文件格式。我说的是 ~1970 格式规范过时。如果这完全取决于我,我们会抛弃文件格式和任何知道如何处理它的工具,然后从头开始。我可以做梦,但不幸的是,这不能解决我的问题。

格式: 定义相当松散,因为多年的无意义修订几乎破坏了它曾经拥有的所有向后兼容性。基本上,唯一不变的是有章节标题,关于这些行之前或之后的内容几乎没有规则。标题是连续的(例如 HEADING1、HEADING2、HEADING3...),但没有编号且不是必需的(例如 HEADING1、HEADING3、HEADING7)。值得庆幸的是,所有可能的航向排列都是已知的。这是一个假的例子:

# Bunch of comments

SHOES # First heading
# bunch text and numbers here

HATS # Second heading
# bunch of text here

SUNGLASSES # Third heading
...

我的问题:我需要通过这些章节标题连接多个文件。我有一个 perl 脚本可以很好地完成这项工作:

while(my $l=<>) {

if($l=~/^SHOES/i) { $r=\$shoes; name($r);}
elsif($l=~/^HATS/i) { $r=\$hats; name($r);}
elsif($l=~/^SUNGLASSES/i) { $r=\$sung; name($r);}
elsif($l=~/^DRESS/i || $l=~/^SKIRT/i ) { $r=\$dress; name($r);}
...
...
elsif($l=~/^END/i) { $r=\$end; name($r);}
else {
$$r .= $l;
}
print STDERR "Finished processing $ARGV\n" if eof;
}

如您所见,使用 perl 脚本时,我基本上只是在到达特定模式匹配时更改引用指向的位置,并将文件的每一行连接到其各自的字符串,直到到达下一个模式匹配。这些随后会作为一个大的串联文件打印出来。

我会并且可以坚持使用 perl,但是我的需求每天都变得越来越复杂,我真的很想看看如何用 python 优雅地解决这个问题(可以吗?)。截至目前,我在 python 中的方法基本上是将整个文件作为字符串加载,搜索标题位置,然后根据标题索引拆分字符串并连接字符串。这需要大量的正则表达式、if 语句和变量,而这在另一种语言中看起来很简单。

这似乎真的归结为一个基本的语言问题。与其他按引用调用的语言相比,我发现了一个关于 python 的“按对象调用”风格的非常好的 SO 讨论。 How do I pass a variable by reference?然而,我仍然想不出一种在 python 中执行此操作的优雅方法。如果有人能帮助我朝正确的方向发展,我将不胜感激。

最佳答案

这甚至不是优雅的 Perl。

my @headers = qw( shoes hats sunglasses dress );

my $header_pat = join "|", map quotemeta, @headers;
my $header_re = qr/$header_pat/i;

my ( $section, %sections );
while (<>) {
if (/($header_re)/) { name( $section = \$sections{$1 } ); }
elsif (/skirt/i) { name( $section = \$sections{'dress'} ); }
else { $$section .= $_; }

print STDERR "Finished processing $ARGV\n" if eof;
}

或者如果你有很多异常(exception)情况:

my @headers = qw( shoes hats sunglasses dress );
my %aliases = ( 'skirt' => 'dress' );

my $header_pat = join "|", map quotemeta, @headers, keys(%aliases);
my $header_re = qr/$header_pat/i;

my ( $section, %sections );
while (<>) {
if (/($header_re)/) {
name( $section = \$sections{ $aliases{$1} // $1 } );
} else {
$$section .= $_;
}

print STDERR "Finished processing $ARGV\n" if eof;
}

使用散列可以保存您未显示的无数 my 声明。

你也可以做 $header_name = $1; name(\$sections{$header_name});$sections{$header_name} .= $_ 以提高可读性。

关于python - 如何使用 python 优雅地按部分组合/连接文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14947165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com