使用Python 2 vs 3从标准输入读取Excel

使用Python 2 vs 3从标准输入读取Excel,python,excel,python-3.x,pandas,python-2.x,Python,Excel,Python 3.x,Pandas,Python 2.x,我试图在命令行上编写一个用于解析Excel的工具;它使用的是Python和pandas的旧版本,而不是新版本 看起来Python2和Python3之间的sys.stdin有所不同,但我无法继续下去 $ 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.r

我试图在命令行上编写一个用于解析Excel的工具;它使用的是Python和pandas的旧版本,而不是新版本

看起来Python2和Python3之间的
sys.stdin
有所不同,但我无法继续下去

$ 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
$conda create-n py2 python=2.7 pandas=0.17.1 xlrd
$source激活py2
(py2)$cat data.xlsx | python-c“将熊猫作为pd导入;导入sys;df=pd.read_excel(sys.stdin);打印(df.head())”
xy
0   1    2
1  10  100
(py2)$source
$conda create-n py3 python=3.6 pandas=0.23.3 xlrd
$source激活py3
(py3)$cat data.xlsx | python-c“将熊猫作为pd导入;导入sys;df=pd.read_excel(sys.stdin);打印(df.head())”
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/Users/bilow/anaconda3/envs/py3/lib/python3.6/site packages/pandas/util/_decorators.py”,第178行,在包装器中
返回函数(*args,**kwargs)
文件“/Users/bilow/anaconda3/envs/py3/lib/python3.6/site packages/pandas/util/_decorators.py”,第178行,在包装器中
返回函数(*args,**kwargs)
文件“/Users/bilow/anaconda3/envs/py3/lib/python3.6/site packages/pandas/io/excel.py”,第307行,以只读excel格式
io=ExcelFile(io,engine=engine)
文件“/Users/bilow/anaconda3/envs/py3/lib/python3.6/site packages/pandas/io/excel.py”,第391行,在__
data=io.read()
文件“/Users/bilow/anaconda3/envs/py3/lib/python3.6/codecs.py”,第321行,在解码中
(结果,消耗)=自身缓冲区解码(数据,自身错误,最终)
UnicodeDecodeError:“utf-8”编解码器无法解码位置15-16中的字节:无效的连续字节
(py3)$source

正如您所指出的,Python2和Python3中的
sys.stdin
对象之间肯定有区别。您可以通过以下方式进行验证:

cat data.xlsx | python -c "import sys; print(sys.stdin)"
在Python2中

open file '<stdin>', mode 'r' at 0x104a7e0c0>
现在,这对我来说似乎很麻烦。或者,为什么不跳过stdin的可能陷阱并传递文件名:

python -c "import pandas as pd, sys; df = pd.read_excel(sys.argv[1]); print(df.head())" data.xlsx

它简化并保证了Python2和Python3的兼容性

正如您所指出的,Python2和Python3中的
sys.stdin
对象之间肯定有区别。您可以通过以下方式进行验证:

cat data.xlsx | python -c "import sys; print(sys.stdin)"
在Python2中

open file '<stdin>', mode 'r' at 0x104a7e0c0>
现在,这对我来说似乎很麻烦。或者,为什么不跳过stdin的可能陷阱并传递文件名:

python -c "import pandas as pd, sys; df = pd.read_excel(sys.argv[1]); print(df.head())" data.xlsx
它简化并保证了Python2和Python3的兼容性