【发布时间】:2018-10-21 08:06:37
【问题描述】:
StringIO 是我们在从文本中读取 pandas 数据帧时使用的类似文件的字符串缓冲区对象,例如"How to create a Pandas DataFrame from a string?"
我们应该将这两个导入中的哪一个用于 StringIO(在 pandas 内)?这是一个长期存在的问题,四年来从未解决。
-
StringIO.StringIO(Python 2) /io.StringIO(Python 3)- 优点:更稳定的面向未来的代码,但迫使我们进行版本分叉,例如请参阅 EmilH 底部的代码。
-
pandas.compat.StringIO- pandas.compat is a 2/3 compatibility package ("without the need for 2to3") introduced back in 0.13.0 (Jan 2014)
- pandas.compat package is still marked 'private' as of 0.22 and no plans to make 'public' 说 “警告 pandas.core、pandas.compat 和 pandas.util 顶级模块被认为是私有的。不能保证这些模块中的功能稳定性。” 虽然它们本质上是从 0.13 开始就没有坏过
-
pandas.compat source 定义
导入
builtins, StringIO/cStringIO, BytesIO, cPickle, httplib,范围、过滤器、映射和 zip 的迭代器版本,以及 Python 3 兼容性的其他必要元素 - 请参阅 0.13.0 whatsnew
用于从标准(来自 EmilH)导入的版本 2/3 分叉代码:
import sys
if sys.version_info[0] < 3:
from StringIO import StringIO
else:
from io import StringIO
# Note: but this is very much a poor-man's version of pandas.compat, which contains much much more
注意:
-
pandas.compat自 pandas 0.13.0(2014 年 1 月)以来作为 pandas 中的子包存在 - 还有seems to have been released as a standalone package: 0.1.0 (Jun 10, 2017) and 0.1.1 (Jun 10, 2017)
【问题讨论】:
-
cc: @Jeff jreback ...
-
我认为这主要是基于意见。所有方法都有效,因此请使用您觉得最舒服的一种。当我回答引用的问题时,我使用 sn-p 来展示在 Python 3 和 Python 2 中使用什么。4 年后的今天,我只使用 Python 3,所以这对我来说不是问题。 Stackoverflow 可能不是在这方面推动标准的地方。如果在 pandas 问题跟踪器上提出问题很重要?
-
@EmilH:这不是基于意见的,这取决于熊猫开发者是否计划改变他们对
pandas.compat的指导。我们甚至不需要pandas.compat中的所有东西都保持稳定,只需要我命名的标识符,但无论如何它自late 2015 以来一直是稳定的,所以他们的警告过于严重 -
@smci 我同意今天他们的警告过于严重(至少对于
StringIO)。但是,无论 pandas 开发人员对以下问题的看法如何:我们应该将这两个导入中的哪一个用于 StringIO(在 pandas 内)? 答案仍然基于意见。如果问题是:是否有官方推荐的方式来使用StringIO(在 pandas 中)? 这不是基于意见的,但是阅读文档,目前的建议仍然是不使用 @ 987654340@(尽管可以说是获取StringIO的一种更清洁的方式)。
标签: pandas import backwards-compatibility stringio python-2to3