如何将返回值(从前一个函数)读入熊猫,python?获取错误消息

Posted

技术标签:

【中文标题】如何将返回值(从前一个函数)读入熊猫,python?获取错误消息【英文标题】:How to read the returned value (from previous function) into pandas, python? Getting error messages 【发布时间】:2017-04-30 02:41:20 【问题描述】:

在下面的程序中

我想从下游函数中的一个函数访问/管道数据。

使用python代码如下:

def main():
data1, data2, data3 = read_file()
do_calc(data1, data2, data3)   

def read_file():
    data1 = ""
    data2 = ""
    data3 = ""

    file1 = open('file1.txt', 'r+').read()
    for line in file1
        do something....
        data1 += calculated_values

    file2 = open('file2.txt', 'r+').read()
    for line in file1
        do something...
        data2 += calculated_values    

    file1 = open('file1.txt', 'r+').read()
    for line in file1
        do something...
        data3 += calculated_values

    return data1, data2, data3

def do_calc(data1, data2, data3):
    d1_frame = pd.read_table(data1, sep='\t')
    d2_frame = pd.read_table(data2, sep='\t')
    d3_frame = pd.read_table(data3, sep='\t')

    all_data = [d1_frame, d2_frame, d3_frame]

main()

给定的代码有什么问题?看起来 panda 无法正确读取输入文件,但正在将 data1、2 和 3 中的值打印到屏幕上。

read_hdf 似乎读取了文件但不正确。有没有办法将函数返回的数据直接读取到熊猫中(无需写入/读取文件)。

错误信息:

Traceback (most recent call last):

  File "calc.py", line 757, in <module>

    main()

  File "calc.py", line 137, in main

    merge_tables(pop1_freq_table, pop2_freq_table, f1_freq_table)

  File "calc.py", line 373, in merge_tables

    df1 = pd.read_table(pop1_freq_table, sep='\t')

  File "/home/everestial007/.local/lib/python3.5/site-packages/pandas/io/parsers.py", line 645, in parser_f

    return _read(filepath_or_buffer, kwds)

  File "/home/everestial007/.local/lib/python3.5/site-packages/pandas/io/parsers.py", line 388, in _read

    parser = TextFileReader(filepath_or_buffer, **kwds)

  File "/home/everestial007/.local/lib/python3.5/site-packages/pandas/io/parsers.py", line 729, in __init__

    self._make_engine(self.engine)

  File "/home/everestial007/.local/lib/python3.5/site-packages/pandas/io/parsers.py", line 922, in _make_engine

    self._engine = CParserWrapper(self.f, **self.options)

  File "/home/everestial007/.local/lib/python3.5/site-packages/pandas/io/parsers.py", line 1389, in __init__

    self._reader = _parser.TextReader(src, **kwds)

  File "pandas/parser.pyx", line 373, in pandas.parser.TextReader.__cinit__ (pandas/parser.c:4019)

  File "pandas/parser.pyx", line 665, in pandas.parser.TextReader._setup_parser_source (pandas/parser.c:7967)

FileNotFoundError: File b'0.667,0.333\n2\t15800126\tT\tT,A\t0.667,0.333\n2\t15800193\tC\tC,T\t0.667,0.333\n2\t15800244\tT\tT,C\......

我将不胜感激。

【问题讨论】:

对于从函数返回到另一个函数的管道数据,我建议使用装饰器。看看这个***.com/questions/739654/… 【参考方案1】:

read_table 期望一个文件作为输入,但您传递的是数据字符串而不是带有文件位置的字符串。您可以将数据写入文件,然后从该文件中读取。假设字符串已经正确格式化:

filename = 'tab_separated_file_1.dat'
with open(filename, 'w') as f:
    f.write(data1)

df1 = pd.read_table(filename, sep='\t')

【讨论】:

我能够将数据写入文件并为下游功能读取它。但是,这不是我想要的。我想从stdout 读取文件,这对我来说是不可能的,然后我求助于从一个函数到另一个函数的管道数据。使用标准输出还有其他建议吗?谢谢 看起来 nrlakin 提供了一个使用 StringIO 的解决方案。 是的,这就是我一直在寻找的。​​span> 【参考方案2】:

正如其他答案所说,read_table 需要一个文件作为输入——或者更准确地说,是一个“类似文件的对象”。您可以使用 StringIO 对象将 data1、data2 和 data3 字符串包装在一个对象中,该对象在提供给 pandas 时会像文件一样“表现”,只需对您的代码进行一些调整:

#Import StringIO...
# python 2
from StringIO import StringIO
# python 3
from io import StringIO

def main():
    data1, data2, data3 = read_file()
    do_calc(data1, data2, data3)   

def read_file():
    # use StringIO objects instead of strings...
    data1 = StringIO()
    data2 = StringIO()
    data3 = StringIO()

    file1 = open('file1.txt', 'r+').read()
    for line in file1
        do something....
        # note that " += " became ".write()"
        data1.write(calculated_values)

    file2 = open('file2.txt', 'r+').read()
    for line in file1
        do something...
        data2.write(calculated_values)

    file1 = open('file1.txt', 'r+').read()
    for line in file1
        do something...
        data3.write(calculated_values)

    return data1, data2, data3

def do_calc(data1, data2, data3):
    d1_frame = pd.read_table(data1, sep='\t')
    d2_frame = pd.read_table(data2, sep='\t')
    d3_frame = pd.read_table(data3, sep='\t')

    all_data = [d1_frame, d2_frame, d3_frame]

main()

【讨论】:

你太棒了。非常感谢! 另外,您可以在读取表格时分配 StringIo。我只是在读取文件而不是创建空变量时添加了StringIO。原因是我还想将data1, 2, 3 写入文件,并能够在代码的其他地方以另一种格式访问它。 @everestial007 没问题——我也遇到过同样的问题。 @everestial007 是的——你可以从文件内容初始化,或者在它说“做某事......”的地方进行一些逐行处理

以上是关于如何将返回值(从前一个函数)读入熊猫,python?获取错误消息的主要内容,如果未能解决你的问题,请参考以下文章

用熊猫将Excel工作表(Listobject)读入python

熊猫:将特定的 Excel 单元格值读入变量

从前一行和特定列值有效地更新熊猫数据框中的 NaN

如何将具有多个标题行的csv文件读入熊猫? [关闭]

当熊猫数据框窗口中的项目相同时如何返回第一个项目?

如何将熊猫系列的列值转换为Python中的列表?