首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用pandas Python 2与3从标准输入读取Excel

使用pandas Python 2与3从标准输入读取Excel
EN

Stack Overflow用户
提问于 2018-07-31 00:27:00
回答 1查看 627关注 0票数 0

我正在尝试编写一个在命令行上解析Excel的工具;它适用于旧版本的Python和pandas,但不适用于新版本。

这看起来像是Python2和Python3在sys.stdin上的不同,但是我不知道如何继续下去。

代码语言:javascript
复制
$ conda create -n py2 python=2.7 pandas=0.17.1 xlrd
$ source activate py2
(py2) $ cat data.xlsx | python -c "import pandas as pd; import sys; df = pd.read_excel(sys.stdin); print(df.head())"
    x    y
0   1    2
1  10  100
(py2) $ source deactivate

$ conda create -n py3 python=3.6 pandas=0.23.3 xlrd
$ source activate py3
(py3) $ cat data.xlsx | python -c "import pandas as pd; import sys; df = pd.read_excel(sys.stdin); print(df.head())"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/Users/bilow/anaconda3/envs/py3/lib/python3.6/site-packages/pandas/util/_decorators.py", line 178, in wrapper
    return func(*args, **kwargs)
  File "/Users/bilow/anaconda3/envs/py3/lib/python3.6/site-packages/pandas/util/_decorators.py", line 178, in wrapper
    return func(*args, **kwargs)
  File "/Users/bilow/anaconda3/envs/py3/lib/python3.6/site-packages/pandas/io/excel.py", line 307, in read_excel
    io = ExcelFile(io, engine=engine)
  File "/Users/bilow/anaconda3/envs/py3/lib/python3.6/site-packages/pandas/io/excel.py", line 391, in __init__
    data = io.read()
  File "/Users/bilow/anaconda3/envs/py3/lib/python3.6/codecs.py", line 321, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 15-16: invalid continuation byte
(py3) $ source deactivate
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-31 02:34:10

正如您所指出的,Python2和Python3中的sys.stdin对象之间肯定存在差异。您可以通过以下方式验证这一点:

代码语言:javascript
复制
cat data.xlsx | python -c "import sys; print(sys.stdin)"

它在Python 2中产生,

代码语言:javascript
复制
open file '<stdin>', mode 'r' at 0x104a7e0c0>

在Python 3中,

代码语言:javascript
复制
<_io.TextIOWrapper name='<stdin>' mode='r' encoding='US-ASCII'>

我对Python I/O的了解还不够,无法说明为什么这是一个有意义的区别。然而,如果使用sys.stdin很重要,那么您需要检查Python版本并分别处理每种情况,如下所示:

代码语言:javascript
复制
# Note, you'll need to specify the `xlrd` engine for the buffer to work
$ cat data.xlsx | python -c "import pandas as pd, sys; data = sys.stdin if sys.version_info[0] == 2 else sys.stdin.buffer; df = pd.read_excel(data, engine='xlrd'); print(df.head())"

现在,这对我来说似乎很麻烦。或者,您为什么不直接跳过stdin的可能陷阱并传递文件名:

代码语言:javascript
复制
python -c "import pandas as pd, sys; df = pd.read_excel(sys.argv[1]); print(df.head())" data.xlsx

它简化并保证了Python 2和3的兼容性。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51598421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档