Использование интерфейсов является ключевым фактором, позволяющим легко проверить ваш код в дополнение к удалению ненужных связей между вашими классами. Создавая интерфейс, который определяет операции над вашим классом, вы разрешаете классам, которые хотят использовать эту функциональность, возможность использовать его, не зависимо от вашего класса реализации напрямую. Если позже вы решите изменить и использовать другую реализацию, вам нужно изменить только часть кода, в котором реализована реализация. Остальная часть кода не должна меняться, потому что это зависит от интерфейса, а не от класса реализации.
Это очень полезно при создании модульных тестов. В тестируемом классе вы зависите от интерфейса и вставляете экземпляр интерфейса в класс (или фабрику, которая позволяет ему создавать экземпляры интерфейса по мере необходимости) через конструктор или определитель свойств. Класс использует предоставленный (или созданный) интерфейс в своих методах. Когда вы начинаете писать свои тесты, вы можете издеваться или подделывать интерфейс и предоставлять интерфейс, который отвечает данными, настроенными в вашем модульном тесте. Вы можете сделать это, потому что ваш тестируемый класс имеет дело только с интерфейсом, а не с вашей конкретной реализацией. Любой класс, реализующий интерфейс, включая ваш макет или поддельный класс, будет делать.
EDIT: Ниже приведена ссылка на статью, где Эрих Гамма обсуждает свою цитату «Программа для интерфейса, а не реализация».
Так же, как указывает ошибка, pandas.read_csv
в качестве первого аргумента нужен файл-подобный объект.
Если вы хотите прочитать csv из строки, вы можете использовать io.StringIO
(Python 3.x) или StringIO.StringIO
(Python 2.x) .
Кроме того, для URL - https://github.com/cs109/2014_data/blob/master/countries.csv - вы возвращаете ответ html
, а не raw csv, вы должны использовать URL-адрес, указанный ссылкой Raw
на странице github для получения исходного ответа csv, который есть - https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv
Пример -
import pandas as pd
import io
import requests
url="https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv"
s=requests.get(url).content
c=pd.read_csv(io.StringIO(s.decode('utf-8')))
Из pandas 0.19.2
теперь вы можете просто передать URL прямо ].
В последней версии pandas (0.19.2
) вы можете напрямую передать url
import pandas as pd
url="https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv"
c=pd.read_csv(url)
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)>
из-за протокола https, который не может обрабатывать urllib.
– multigoodverse
13 February 2018 в 17:00
Проблема, с которой вы сталкиваетесь, заключается в том, что вывод, который вы получаете в переменной 's', не является csv, а html-файлом. Чтобы получить исходный код csv, вам необходимо изменить URL-адрес:
' https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv '
Вторая проблема заключается в том, что read_csv ожидает имя файла, мы можем решить это, используя StringIO из модуля io. Третья проблема заключается в том, что request.get (url) .content предоставляет поток байтов, мы можем решить это, используя вместо этого request.get (url) .text.
Конечным результатом является этот код:
from io import StringIO
import pandas as pd
import requests
url='https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv'
s=requests.get(url).text
c=pd.read_csv(StringIO(s))
output:
>>> c.head()
Country Region
0 Algeria AFRICA
1 Angola AFRICA
2 Benin AFRICA
3 Botswana AFRICA
4 Burkina AFRICA
Как я уже говорил, вам нужно использовать объект StringIO и декодировать, т. е. c=pd.read_csv(io.StringIO(s.decode("utf-8")))
, если вы используете запросы, вам нужно декодировать, поскольку .content возвращает bytes , если вы использовали .текст, который вам просто нужно будет пройти s как s = requests.get(url).text
c = pd.read_csv(StringIO(s))
.
Простейший подход - передать правильный URL-адрес raw данных непосредственно на read_csv
, вам не нужно передавать файл как объект, вы можете передать URL-адрес так что вам вообще не нужны запросы:
c = pd.read_csv("https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv")
print(c)
Выход:
Country Region
0 Algeria AFRICA
1 Angola AFRICA
2 Benin AFRICA
3 Botswana AFRICA
4 Burkina AFRICA
5 Burundi AFRICA
6 Cameroon AFRICA
..................................
Из docs :
filepath_or_buffer:
строка или дескриптор файла / StringIO Строкой может быть URL. Допустимые схемы URL включают http, ftp, s3 и файл. Для URL-адресов файлов ожидается хост. Например, локальный файл может быть файлом: //localhost/path/to/table.csv
c=pd.read_csv(url)
– inodb 26 January 2017 в 19:29