Аргумент 1 StringIO () должен быть строкой или буфером, а не cStringIO.StringIO - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть функция, которая читает объект содержимого в кадр данных pandas.

import pandas as pd
from cStringIO import StringIO, InputType

def create_df(content):
    assert content, "No content was provided, can't create dataframe"

    if not isinstance(content, InputType):
        content = StringIO(content)
    content.seek(0)
    return pd.read_csv(content)

Однако я продолжаю получать ошибку TypeError: StringIO() argument 1 must be string or buffer, not cStringIO.StringIO

Я проверил входящий тип содержимого до преобразования StringIO () внутри функции, и он имеет тип str. Без преобразования я получаю ошибку, что у объекта str нет функции поиска. Есть идеи, что тут не так?

1 Ответ

0 голосов
/ 12 сентября 2018

Вы тестировали только для InputType, который является cStringIO.StringIO() экземпляром, который поддерживает чтение.Похоже, у вас есть другой тип, OutputType, экземпляр, созданный для экземпляра, который поддерживает запись в:

>>> import cStringIO
>>> finput = cStringIO.StringIO('Hello world!')  # the input type, it has data ready to read
>>> finput
<cStringIO.StringI object at 0x1034397a0>
>>> isinstance(finput, cStringIO.InputType)
True
>>> foutput = cStringIO.StringIO()  # the output type, it is ready to receive data
>>> foutput
<cStringIO.StringO object at 0x102fb99d0>
>>> isinstance(foutput, cStringIO.OutputType)
True

Вам необходимо проверитьдля обоих типов, просто используйте кортеж двух типов в качестве второго аргумента для isinstance():

from cStringIO import StringIO, InputType, OutputType

if not isinstance(content, (InputType, OutputType)):
    content = StringIO(content)

или, и это лучше проверьте атрибуты read и seek, чтобы вы также могли поддерживать обычные файлы:

if not (hasattr(content, 'read') and hasattr(content, 'seek')):
    # if not a file object, assume it is a string and wrap it in an in-memory file.
    content = StringIO(content)

или просто проверить строки и [буферы] (https://docs.python.org/2/library/functions.html#buffer(,, поскольку онитолько два типа, которые может поддерживать StringIO():

if isinstance(content, (str, buffer)):
    # wrap strings into an in-memory file
    content = StringIO(content)

Это имеет дополнительный бонус, что любой другой файловый объект в библиотеке Python, включая сжатые файлы и tempfile.SpooledTemporaryFile() и io.BytesIO(), также будет приняти работа.

...