【问题标题】:Is there are Python equivalent of Perl's __DATA__ filehandle?是否有 Python 等效于 Perl 的 __DATA__ 文件句柄?
【发布时间】:2016-07-14 08:17:37
【问题描述】:

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

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

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

来自doc

__DATA__ 标记告诉 perl 编译器 编译完成。

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

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

【问题讨论】:

  • 对于我们这些精通 Python 而不是 Perl 的人,您能否解释一下它的实际作用 吗?
  • @jonrsharpe:它允许您将数据添加到模块的末尾,然后可以像文件一样读取。

标签: python perl filehandle


【解决方案1】:

不,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 中,您只需将数据文件 next 放到源文件中并读取即可。您可以使用__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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 2010-10-31
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    相关资源
    最近更新 更多