Python中是否有类似于Perl的__DATA__文件句柄的功能?

15

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

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

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

文档中:

__DATA__标记告诉perl编译器perl代码已经完成编译。

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

Python中是否有相应的功能?如果没有,有人能建议实现类似功能的最Python方式吗?


1
你能解释一下那实际上是做什么的吗?对于那些比Perl更熟悉Python的人来说。 - jonrsharpe
1
它允许您将数据添加到模块的末尾,然后可以像读取文件一样读取该数据。 - Martijn Pieters
2个回答

13

不,Python中没有直接等价的东西。将您的数据放入一个多行变量中:

DATA = '''\
line1
line2
'''
您可以使用DATA.splitlines()v2/v3,如果您必须访问单独的行。只要您在加载整个模块之后不调用函数,并且仅在函数中使用名称DATA,就可以将其放置在Python文件的末尾。
或者,打开当前模块并从其中读取:
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

0
一个简单的模拟 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 
"""

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接