【问题标题】:using pandas read_excel to read from stdin使用 pandas read_excel 从标准输入读取
【发布时间】:2019-10-21 01:04:18
【问题描述】:

注意:我已经按照以下方法解决了这个问题:

我可以使用 to_csv 在 python / pandas 中写入标准输出。像这样的东西很好用:

final_df.to_csv(sys.stdout, index=False)

我想读入一个实际的 excel 文件(不是 csv)。我想输出 CSV,但输入 xlsx。我有这个文件

bls_df = pd.read_excel(sys.stdin, sheet_name="MSA_dl", index_col=None)

但这似乎不起作用。是否有可能做我正在尝试的事情,如果可以,如何做到这一点?

注意事项:

  1. 实际输入文件是压缩文件https://www.bls.gov/oes/special.requests/oesm18ma.zip中的“MSA_M2018_dl.xlsx”。

我像这样下载并提取数据文件:

curl -o oesm18ma.zip'https://www.bls.gov/oes/special.requests/oesm18ma.zip'
7z x oesm18ma.zip
  1. 我已经解决了这个问题,脚本 test01.py 从标准输入读取并写入标准输出。注意在 read_excel() 调用中使用 sys.stdin.buffer

    导入系统 导入操作系统 将熊猫导入为 pd

    BLS_DF = pd.read_excel(sys.stdin.buffer, sheet_name="MSA_dl", index_col=None)

    BLS_DF.to_csv(sys.stdout, index=False)

  2. 我将其调用为:

    猫 MSA_M2018_dl.xlsx | python3 test01.py

  3. 这是一个小型测试程序,用于说明想法,同时消除复杂性。这不是我正在开发的实际程序。

【问题讨论】:

  • 是否可以假设 sys.stdin 是您要阅读的 excel 文件的字符串?
  • 我不确定您所说的“字符串”是什么意思。这是excel文件的实际内容。假设我上面的程序叫做 foo.py,那么我想调用类似的东西:cat excelfile.xlsx | python3 foo.py
  • 字符串,如返回字符串的type()。您将需要为我们提供更多背景信息。示例数据和更多代码。当你说“这是excel文件的实际内容”时,我不明白
  • 当然。 excel 文件是二进制而不是文本。
  • 我可以使用 pandas 从标准输入读取 excel,请参阅 *.com/q/59468669/1782641 我的问题是,当使用 < /path/to/file.xlsx 而不是 cat /path/to/file.xlsx | 时,pandas 似乎只能从标准输入成功读取

标签: python excel pandas dataframe stdin


【解决方案1】:

根据this 的回答,可能是:

import sys
import pandas as pd
import io

csv = ""
for line in sys.stdin:
    csv += line

df = pd.read_csv(io.StringIO(csv))

【讨论】:

  • 源文件是xlsx,不是csv。
  • 你不能简单地使用cat输出一个xlsx文件,你要么需要先转换它,例如使用xlsx2csv,然后把它当作一个csv来处理,要么需要找到一种方法来提供它我想作为字节流
  • 我认为 xlsx2csv 会起作用,尽管我确实找到了一种直接执行此操作的方法,正如我在上面修改后的问题中所指出的那样。