2016-04-13 3 views
0

У меня есть некоторые большие файлы csv и xlsx, которые мне нужно настроить для pandas DataFrames. У меня есть код, который находит эти файлы в каталоге (при печати они показывают правильные пути). Затем эти пути передаются вспомогательной функции, которая предназначена для установки необходимых файлов данных для файлов, после чего данные будут переданы другим функциям для некоторых манипуляций. Я собираюсь записать данные в файл (загружая шаблон, записывая данные на него и сохраняя этот файл) после его завершения.pandas, возвращающий пустые DataFrames для CSV

настоящее время у меня код как:

import pandas 
# some set-up functions (which work; verified using print statements) 

def createDataFrame(filename): 
    if filename.endswith('.csv'): 
     df = pandas.read_csv(StringIO(filename), skip_blank_lines=True, index_col=False, 
          encoding="utf-8", skipinitialspace=True) 

Когда я пытаюсь print(df), я получаю:

Empty DataFrame

Columns: [a.csv]

Index: []

и print(StringIO(filename)) дает мне:

<_io.StringIO object at 0x004D1990>

Однако, когда я выхожу из StringIO() около filename в функции, я получаю это Ошибка:

OSError: File b'a.csv' does not exist

Везде, что я был в состоянии найти информацию по этому вопросу имеет либо только что сказал import and start using, или переговоры об использовании read_csv(), а не from_csv() (from this question, который был не очень полезно здесь), и даже the current pandas docs в основном говорят, что это должно быть так же просто, как передать файл pandas.read_csv().

1) Я проверил, что у меня есть полные разрешения и что файл действителен и существует. Почему я получаю OSError?

2) Когда я использую StringIO(), почему я все еще получаю пустой DataFrame здесь? Как я могу это исправить?

Заранее спасибо.

+0

Зачем вам 'StringIO'? разве это не будет работать без этого? то есть 'pandas.read_csv (filename, .....)' – EdChum

+0

Как указано в моем вопросе, без StringIO я получаю OSError. Я не мог понять, почему, и был бы признателен за любые указатели, которые могли бы решить эту проблему (а потом, возможно, все это сработает) – DJGrandpaJ

ответ

0

Я решил это.

StringIO был основной причиной этой проблемы. Потому что я на Windows, os.path.is_file() возвращается значение False, и я получил ошибку:

OSError: File b'a.csv' does not exist

Это не было, пока я не наткнулся на this page from the Python 2.5 docs, что я обнаружил, что вызов должен быть на самом деле os.path.isfile() на Windows, так как он использует ntpath за кулисами. Это лучше справится с разницей в именах путей между системами (Windows использует «\», Unix использует «/»).

Поскольку у меня было что-то странное в моих путях, панды не смогли правильно загрузить CSV-файлы в DataFrames.

Просто изменив свой код от этого:

import pandas 
# some set-up functions (which work; verified using print statements) 

def createDataFrame(filename): 
    if filename.endswith('.csv'): 
     df = pandas.read_csv(StringIO(filename), skip_blank_lines=True, index_col=False, 
          encoding="utf-8", skipinitialspace=True) 

к этому:

import pandas 
# some set-up functions (which have been updated) 

def createDataFrame(filename): 
    basepath = config.complete_datasets_dir 
    fullpath = os.path.join(basepath, filename) 

    if filename.endswith('.csv'): 
     df = pandas.read_csv(fullpath, skip_blank_lines=True, index_col=False, 
          encoding="utf-8", skipinitialspace=True) 

и соответствующим образом обновить функцию, которая вызывает эту функцию:

def somefunc(): 
    dfs = [] 
    data_lists = getInputFiles() # checks data directory for files containing info 
    for item in data_lists: 
     tdata = createDataFrames(item) 
     dfs.append(tdata) 
    print(dfs) 

я был в состоянии получить результат, который я искал:

[ 1 2 3 4 5 6 7 8 9 10 
0 11 12 13 14 15 16 17 18 19 20 
1 21 22 23 24 25 26 27 28 29 30 
2 31 32 33 34 35 36 37 38 39 40,  1 2 3 4 5 6 7 8 9 10 
0 11 12 13 14 15 16 17 18 19 20 
1 21 22 23 24 25 26 27 28 29 30] 

, который представляет собой список из двух DataFrames, первый из которых был получен из CSV, содержащего только числа 1-40 (всего 4 строки, без заголовков); второй файл содержит только цифры 1-30 (форматируется одинаково).

Я надеюсь, что это поможет кому-то в будущем.

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