Получить файлы `.csv / .txt` из интернет-местоположения в Python [duplicate]

Использование интерфейсов является ключевым фактором, позволяющим легко проверить ваш код в дополнение к удалению ненужных связей между вашими классами. Создавая интерфейс, который определяет операции над вашим классом, вы разрешаете классам, которые хотят использовать эту функциональность, возможность использовать его, не зависимо от вашего класса реализации напрямую. Если позже вы решите изменить и использовать другую реализацию, вам нужно изменить только часть кода, в котором реализована реализация. Остальная часть кода не должна меняться, потому что это зависит от интерфейса, а не от класса реализации.

Это очень полезно при создании модульных тестов. В тестируемом классе вы зависите от интерфейса и вставляете экземпляр интерфейса в класс (или фабрику, которая позволяет ему создавать экземпляры интерфейса по мере необходимости) через конструктор или определитель свойств. Класс использует предоставленный (или созданный) интерфейс в своих методах. Когда вы начинаете писать свои тесты, вы можете издеваться или подделывать интерфейс и предоставлять интерфейс, который отвечает данными, настроенными в вашем модульном тесте. Вы можете сделать это, потому что ваш тестируемый класс имеет дело только с интерфейсом, а не с вашей конкретной реализацией. Любой класс, реализующий интерфейс, включая ваш макет или поддельный класс, будет делать.

EDIT: Ниже приведена ссылка на статью, где Эрих Гамма обсуждает свою цитату «Программа для интерфейса, а не реализация».

http://www.artima.com/lejava/articles/designprinciples.html

59
задан albert 4 September 2015 в 15:38
поделиться

4 ответа

Так же, как указывает ошибка, 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 прямо ].

73
ответ дан LondonRob 20 August 2018 в 20:26
поделиться
  • 1
    Большое спасибо, очень помог мне. – venom 5 September 2015 в 17:47
  • 2
    рад, что мы можем быть полезны, я также хотел бы попросить вас принять ответ, в зависимости от того, что вам больше всего вам помогло. Нажав на галочку в левой части ответа, это будет полезно для сообщества. – Anand S Kumar 5 September 2015 в 17:48
  • 3
    Что делать, если ответ большой, и я хочу передать его вместо того, чтобы потреблять память для закодированного контента, декодированного контента и объекта StringIO? – akaihola 4 October 2016 в 06:00
  • 4
    В последней версии панд вы можете прямо указать URL-адрес, т. Е. c=pd.read_csv(url) – inodb 26 January 2017 в 19:29

В последней версии 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)
115
ответ дан inodb 20 August 2018 в 20:26
поделиться
  • 1
    ИМО теперь следует отметить как правильный ответ. – fearless_fool 10 April 2017 в 02:30
  • 2
    Я бы согласился на это. – Pramit 11 April 2017 в 00:38
  • 3
    кажется, что использование этого непосредственно вместо запросов напрямую не использует request-cache , даже если используется – shadi 11 September 2017 в 10:23
  • 4
    Этот код возвращает urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)> из-за протокола https, который не может обрабатывать urllib. – multigoodverse 13 February 2018 в 17:00
  • 5

Проблема, с которой вы сталкиваетесь, заключается в том, что вывод, который вы получаете в переменной '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
3
ответ дан PabTorre 20 August 2018 в 20:26
поделиться
  • 1
    Большое спасибо за ваш объяснительный ответ. Я понял ошибку, исправил код и, наконец, работал :) – venom 5 September 2015 в 17:48

Как я уже говорил, вам нужно использовать объект 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

7
ответ дан Padraic Cunningham 20 August 2018 в 20:26
поделиться
  • 1
    Вы можете подать URL прямо на pandas read_csv! конечно! это намного проще, чем тот, который я нашел! : D – PabTorre 4 September 2015 в 15:19
  • 2
    @pabtorre, да, пример того, почему чтение документов - хорошая идея. – Padraic Cunningham 4 September 2015 в 15:21
  • 3
    Я думаю, что я понял проблему, спасибо вам большое ... – venom 5 September 2015 в 17:46
Другие вопросы по тегам:

Похожие вопросы: