2016-12-14 9 views
0

В следующей программеКак читать возвращаемое значение (из предыдущей функции) в pandas, 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 не умеет правильно читать входные файлы, но печатает значения из данных1, 2 и 3 на экране.

read_hdf похоже, что прочитал файл, но не правильно. Есть ли способ прочитать данные, возвращаемые функцией напрямую в pandas (без записи/чтения в файл).

Сообщение об ошибке:

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\...... 

Я был бы признателен за какие-либо объяснения.

+0

(1) Я бы порекомендовал вам использовать 'pd.read_csv (file1, Сентябрь = "\ т")', а не читать таблицу. (2) Если каждый из файлов содержит 1 столбец, почему бы не прочитать их непосредственно в пандах и выполнить ваши вычисления? Это сделает вашу жизнь намного легче, чем писать отдельную функцию для чтения. – Rohit

ответ

2

pd.read_table(data1, sep='\t') считает, что data1 как путь к файлу, так как он не имеет метода read. Вы можете увидеть в стеке, что он пытается открыть файл с именем содержимого файла csv.

с read_table помощью:

Parameters 
-------- 
filepath_or_buffer : str, pathlib.Path, py._path.local.LocalPath or any 
object with a read() method (such as a file handle or StringIO) 

Вы должны преобразовать его в io.StringIO объект, чтобы его можно было прочитать

Quickfix:

pd.read_table(io.StringIO(data1), sep='\t') 

но создает копию данных. Наилучшее решение было бы создание io.StringIO буферов непосредственно:

def read_file(): 
    data1 = io.StringIO() 


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

    # in the end 
    data1.seek(0) # reset to start of "file" 

 Смежные вопросы

  • Нет связанных вопросов^_^