2016-02-12 6 views
11

यहाँ मेरी कोड है:उपयोग अजगर अनुरोध डाउनलोड करने के लिए सीएसवी

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 

मेरा सवाल यह है कि इस स्थिति में एक सीएसवी फ़ाइल पढ़ने का सबसे प्रभावी तरीका क्या है। और वास्तविक सीएसवी फ़ाइल को कैसे डाउनलोड करें।

धन्यवाद

उत्तर

20

यह मदद करनी चाहिए:

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) 

ouput नमूना: https://stackoverflow.com/a/33079644/295246


संपादित करें:: Oth

['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'] 
[...] 

जवाब के साथ संबंधित प्रश्न अगर आपको बड़ी फाइलें डाउनलोड करने की ज़रूरत है तो एर उत्तर उपयोगी हैं (यानी। stream=True)।

+0

splitlines की शब्दकोशों पुनरावृत्ति करने के लिए() !! यह काम करता है, धन्यवाद श्रीमान। – viviwill

1

थोड़ी सी खोज से, मुझे लगता है कि फ़ाइल सार्वभौमिक न्यूलाइन मोड में खोली जानी चाहिए, जिसे आप सीधे प्रतिक्रिया सामग्री (मुझे लगता है) के साथ नहीं कर सकते हैं।

कार्य को समाप्त करने के लिए, आप या तो डाउनलोड की गई सामग्री को अस्थायी फ़ाइल में सहेज सकते हैं, या इसे स्मृति में संसाधित कर सकते हैं।

फ़ाइल के रूप में सहेजें:

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) 

स्मृति में:

(अद्यतन किया जा करने के लिए)

0

यदि फ़ाइल बहुत बड़ी है अनुरोधों का 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) 
7

इन उत्तरों को सरल बनाने के लिए, और डाउनलोड करते समय प्रदर्शन में वृद्धि जी एक बड़ी फाइल, नीचे थोड़ा और अधिक कुशलता से काम कर सकते हैं।

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 

GET अनुरोध में stream=True की स्थापना, जब हम (r.iter_lines() csv.reader के पास) से, हम एक generator csv.reader करने से गुजर रहे हैं()। ऐसा करके, हम for row in reader के साथ प्रतिक्रिया में प्रत्येक पंक्ति पर आलसी ढंग से csv.reader() को सक्षम करते हैं।

यह प्रसंस्करण शुरू करने से पहले पूरी फ़ाइल को स्मृति में लोड करने से बचाता है, बड़ी फ़ाइलों के लिए मेमोरी ओवरहेड को काफी हद तक कम करता है।

+5

मुझे 'कोडेक्स आयात' भी करना था और 'r.iter_lines()' को 'codecs.iterdecode() 'के भीतर लपेटना था:' codecs.iterdecode (r.iterlines(), 'utf-8')' .. 'बाइट' बनाम 'str' मुद्दों को हल करने के लिए, यूनिकोड डिकोडिंग समस्याएं और सार्वभौमिक नई लाइन समस्याएं हल करने के लिए। –

+0

धन्यवाद @IrvinH। , मैं एक समस्या मे फंस गया। btw यह r.iter_lines() होना चाहिए जो आपने अंडरस्कोर को याद किया था। – linqu

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) 
संबंधित मुद्दे