Использовать запросы python для загрузки CSV
Вот мой код:
import csv
import requests
with requests.Session() as s:
s.post(url, data=payload)
download = s.get('url that directly download a csv report')
Это дает мне доступ к файлу csv. Я пробовал использовать другой метод для загрузки:
Это даст файл csv в одной строке:
print download.content
Это печатает первую строку и возвращает ошибку: _csv.Error: символ новой строки, отображаемый в некотируемом поле
cr = csv.reader(download, dialect=csv.excel_tab)
for row in cr:
print row
Это напечатает письмо в каждой строке, и оно не распечатает все это:
cr = csv.reader(download.content, dialect=csv.excel_tab)
for row in cr:
print row
Мой вопрос - это то, что является самым эффективным способом чтения csv файла в этой ситуации.
И как загрузить фактический файл csv.
спасибо
Ответы
Ответ 1
Это должно помочь:
import csv
import requests
CSV_URL = 'http://samplecsvs.s3.amazonaws.com/Sacramentorealestatetransactions.csv'
with requests.Session() as s:
download = s.get(CSV_URL)
decoded_content = download.content.decode('utf-8')
cr = csv.reader(decoded_content.splitlines(), delimiter=',')
my_list = list(cr)
for row in my_list:
print(row)
Пример вывода:
['street', 'city', 'zip', 'state', 'beds', 'baths', 'sq__ft', 'type', 'sale_date', 'price', 'latitude', 'longitude']
['3526 HIGH ST', 'SACRAMENTO', '95838', 'CA', '2', '1', '836', 'Residential', 'Wed May 21 00:00:00 EDT 2008', '59222', '38.631913', '-121.434879']
['51 OMAHA CT', 'SACRAMENTO', '95823', 'CA', '3', '1', '1167', 'Residential', 'Wed May 21 00:00:00 EDT 2008', '68212', '38.478902', '-121.431028']
['2796 BRANCH ST', 'SACRAMENTO', '95815', 'CA', '2', '1', '796', 'Residential', 'Wed May 21 00:00:00 EDT 2008', '68880', '38.618305', '-121.443839']
['2805 JANETTE WAY', 'SACRAMENTO', '95815', 'CA', '2', '1', '852', 'Residential', 'Wed May 21 00:00:00 EDT 2008', '69307', '38.616835', '-121.439146']
[...]
Связанный с ответом вопрос: fooobar.com/questions/53557/...
Изменить: Другие ответы полезны, если вам нужно загрузить большие файлы (т.е. stream=True
).
Ответ 2
Чтобы упростить эти ответы и повысить производительность при загрузке большого файла, приведенное ниже может работать более эффективно.
import requests
from contextlib import closing
import csv
url = "http://download-and-process-csv-efficiently/python.csv"
with closing(requests.get(url, stream=True)) as r:
reader = csv.reader(r.iter_lines(), delimiter=',', quotechar='"')
for row in reader:
print row
Установив stream=True
в запросе GET, когда мы передаем r.iter_lines()
в csv.reader(), мы передаем generator в csv.reader(). Поступая таким образом, мы разрешаем csv.reader() лениво перебирать по каждой строке ответа for row in reader
.
Это позволяет избежать загрузки всего файла в память, прежде чем мы начнем его обрабатывать, резко сократив объем памяти для больших файлов.
Ответ 3
Вы также можете использовать DictReader
для итерации словарей {'columnname': 'value', ...}
import csv
import requests
response = requests.get('http://example.test/foo.csv')
reader = csv.DictReader(response.iter_lines())
for record in reader:
print(record)
Ответ 4
Из небольшого поиска, который я понимаю, файл должен быть открыт в универсальном режиме новой строки, который вы не можете напрямую делать с содержимым ответа (я думаю).
Чтобы завершить задачу, вы можете либо сохранить загруженный контент во временный файл, либо обработать его в памяти.
Сохранить как файл:
import requests
import csv
import os
temp_file_name = 'temp_csv.csv'
url = 'http://url.to/file.csv'
download = requests.get(url)
with open(temp_file_name, 'w') as temp_file:
temp_file.writelines(download.content)
with open(temp_file_name, 'rU') as temp_file:
csv_reader = csv.reader(temp_file, dialect=csv.excel_tab)
for line in csv_reader:
print line
# delete the temp file after process
os.remove(temp_file_name)
В памяти:
(для обновления)
Ответ 5
Вы можете обновить принятый ответ с помощью метода iter_lines запросов, если файл очень большой
import csv
import requests
CSV_URL = 'http://samplecsvs.s3.amazonaws.com/Sacramentorealestatetransactions.csv'
with requests.Session() as s:
download = s.get(CSV_URL)
line_iterator = (x.decode('utf-8') for x in download.iter_lines(decode_unicode=True))
cr = csv.reader(line_iterator, delimiter=',')
my_list = list(cr)
for row in my_list:
print(row)