#python #pandas #stringio
#python #pandas #stringio
Вопрос:
Я хотел бы скопировать данные в фрейм данных pandas, используя StringIO, а не текстовый файл. Некоторые файлы будут действительно большими, и я бы предпочел не иметь больших текстовых файлов, а затем удалить. Использование StringIO кажется гораздо более приятным решением.
Если я сделаю это, фрейм данных не будет создан без проблем
import pandas as pd
import requests
indIndustryDataURL='https://download.bls.gov/pub/time.series/pc/pc.industry' #0.04MB
# put data from web into a requests.get() object
indIndustryData=requests.get(indIndustryDataURL, allow_redirects=True)
# Store column names and data rows from requests.get() in separate list objects
industryDataColNames=indIndustryData.text.split('rn')[0].split('t')
industryDataRowData=indIndustryData.text.split('rn')[1:-1]
# Print row data into a text file ready for import pandas like csv
with open('industryDataRowData.txt','w') as f:
f.writelines('%sn' % row for row in industryDataRowData )
#This works fine
df1=pd.read_csv('industryDataRowData.txt',sep='t', names=industryDataColNames)
Но когда я пытаюсь использовать StringIO() приведенный ниже код из того же jupyter notebook, он не позволяет мне из-за ошибки о моем слишком длинном пути.
import io
io = io.StringIO()
start_time = datetime.now()
io.writelines(industryDataRowData)
io.seek(0)
df2=pd.read_csv(io.getvalue(),sep='t', names=industryDataColNames)
Ошибка значения: stat: слишком длинный путь для Windows
Любой совет?
Ответ №1:
Вы передаете буфер, а не его содержимое.
df2=pd.read_csv(io, sep='t', ...)
Комментарии:
1. Кажется, это работает, но затем, когда я заглядываю внутрь фрейма данных, он пуст. Имена столбцов есть, но df2.head() не дает результатов, а len(df2) возвращает 0. у ввода-вывода есть данные, потому что, когда я выполняю io.getvalue()[0:40], я вижу строку данных.
Ответ №2:
Попробуйте:
df2=pd.read_csv(io.getvalue().strip(),sep='t', names=industryDataColNames)