繁体   English   中英

是否有与 Perl 的 __DATA__ 文件句柄等效的 Python ?

[英]Is there are Python equivalent of Perl's __DATA__ filehandle?

在 Perl 中,我经常从脚本末尾的文件句柄__DATA__中读取数据:

while (<DATA>) {
    chomp;
    say;
}
__DATA__
line1
line2 

我发现测试代码等比读取文件更快,因为这意味着我可以即时编辑其内容。

文档

__DATA__标记告诉 perl 编译器,用于编译的 perl 代码已完成。

__DATA__标记之后的所有内容都可以通过文件句柄FOOBAR::DATA读取,其中 FOOBAR 是到达__DATA__标记时当前FOOBAR的名称。

Python 中是否有等价物? 如果没有,任何人都可以提出最类似于 Python 的方式来实现类似的事情吗?

不,Python中没有直接的等价物。 将数据放在多行变量中:

DATA = '''\
line1
line2
'''

然后,如果必须访问单独的行,则可以使用DATA.splitlines() v2 / v3 您可以将它放在Python文件的末尾,前提是您只在整个模块加载后才调用的函数中使用名称DATA

或者,打开当前模块并从中读取:

with open(__file__.rstrip('co')) as data:
    for line in data:
        while line != '# __DATA__\n':
            continue
        # do something with the rest of the 'data' in the current source file.

# ...

# __DATA__
# This is going to be read later on.

但是,模块的其余部分仍然必须至少是有效的Python语法; 不能告诉Python解析器停止解析超出给定点。

一般来说,在Python中,您只需将数据文件放在源文件旁边并读取即可。 您可以使用__file__变量生成“当前目录”的路径,从而生成相同位置的任何其他文件:

import os.path

current_dir = os.path.dirname(os.path.abspath(__file__))
with open(os.path.join(current_dir, 'data.txt')) as data:
    # read from data.txt

模拟 Perl 的简单方法是:

import re

with open(__file__) as fp:
    for i in re.match(r'(?smx) .*? """\n __DATA__\n (.*)\n """\n', fp.read()).group(1).split("\n"):
        print(i)

"""
__DATA__
line1
line2 
"""

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM