5

मैं एक प्रकाशित Google शीट दस्तावेज़ से उत्पन्न एक सीएसवी फ़ाइल को सहेजने का एक आसान तरीका ढूंढ रहा हूं? चूंकि इसे प्रकाशित किया गया है, यह एक सीधा लिंक (नीचे दिए गए उदाहरण में उद्देश्य पर संशोधित) के माध्यम से सुलभ है।पाइथन 3 (या 2) से सीएसवी के रूप में आप Google शीट फ़ाइल को कैसे सहेजते हैं?

मेरे सभी ब्राउज़र मुझे लिंक लॉन्च करने के तुरंत बाद सीएसवी फ़ाइल को सहेजने के लिए संकेत देंगे।

न तो:

DOC_URL = 'https://docs.google.com/spreadsheet/ccc?key=0AoOWveO-dNo5dFNrWThhYmdYW9UT1lQQkE&output=csv'  

f = urllib.request.urlopen(DOC_URL) 
cont = f.read(SIZE) 
f.close() 
cont = str(cont, 'utf-8') 
print(cont) 

, और न ही:

req = urllib.request.Request(DOC_URL) 
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.13 (KHTML, like Gecko) Chrome/24.0.1284.0 Safari/537.13') 
f = urllib.request.urlopen(req) 
print(f.read().decode('utf-8')) 

प्रिंट कुछ भी लेकिन html सामग्री।

(यह अन्य पोस्ट पढ़ने के बाद 2 संस्करण की कोशिश की: Download google docs public spreadsheet to csv with python।)

मैं गलत क्या कर रहा हूँ पर कोई विचार? मैं अपने Google खाते से लॉग आउट हूं, अगर यह किसी भी चीज़ के लायक है, लेकिन यह मैंने कोशिश की किसी भी ब्राउज़र से काम करता है। जहां तक ​​मुझे समझा गया, Google डॉक्स एपीआई अभी तक पायथन 3 पर पोर्ट नहीं किया गया है और व्यक्तिगत उपयोग के लिए मेरी छोटी परियोजना के "खिलौना" परिमाण को दिया गया है, यह इसे जाने-माने से उपयोग करने के लिए बहुत अधिक समझ नहीं लेगा, अगर मैं इसे रोक सकता हूँ।

2 की कोशिश में, मैं, 'उपयोगकर्ता-एजेंट' छोड़ दिया के रूप में मैं सोच रहा था कि शायद स्क्रिप्ट से आ रही (/ b ग कोई पहचान की जानकारी मौजूद है) को नजरअंदाज किया जा सकता है के रूप में सोचा अनुरोध है, लेकिन यह नहीं था एक अंतर।

उत्तर

4

Google कुकी-सेटिंग 302 रीडायरेक्ट की एक श्रृंखला के साथ प्रारंभिक अनुरोध का जवाब देता है। यदि आप अनुरोधों के बीच कुकीज़ को संग्रहीत और पुनः सबमिट नहीं करते हैं, तो यह आपको लॉगिन पृष्ठ पर रीडायरेक्ट करता है।

तो, समस्या उपयोगकर्ता-एजेंट शीर्षलेख के साथ नहीं है, यह तथ्य है कि डिफ़ॉल्ट रूप से, urllib.request.urlopen कुकीज़ संग्रहीत नहीं करता है, लेकिन यह HTTP 302 रीडायरेक्ट का पालन करेगा।

निम्नलिखित कोड स्थान DOC_URL द्वारा निर्दिष्ट में एक सार्वजनिक स्प्रेडशीट पर ठीक उपलब्ध काम करता है:

>>> from http.cookiejar import CookieJar 
>>> from urllib.request import build_opener, HTTPCookieProcessor 
>>> opener = build_opener(HTTPCookieProcessor(CookieJar())) 
>>> resp = opener.open(DOC_URL) 
>>> # should really parse resp.getheader('content-type') for encoding. 
>>> csv_content = resp.read().decode('utf-8') 

कैसे वेनिला अजगर में यह करने के लिए आप से पता चला है, अब मैं यही कहूंगी कि इस बारे में जाने के लिए राइट वे ™ सबसे उत्कृष्ट requests library का उपयोग करना है। यह extremely well documented है और इस तरह के कार्यों को पूरा करने के लिए अविश्वसनीय रूप से सुखद बनाता है।

>>> import requests 
>>> csv_content = requests.get(DOC_URL).text 

एक पंक्ति अपने इरादे अधिक स्पष्ट रूप से व्यक्त करता है कि:

उदाहरण के लिए, एक ही csv_contentrequests पुस्तकालय का उपयोग करके उपरोक्त के रूप में प्राप्त करने के लिए के रूप में सरल है। लिखना आसान और पढ़ने में आसान है। अपने आप को करें - और कोई भी जो आपका कोडबेस साझा करता है - एक पक्ष और बस requests का उपयोग करें।

+0

प्रतिक्रिया के लिए धन्यवाद, वास्तव में इसकी सराहना करें! –

2

जबकि requests पुस्तकालय अजगर से HTTP अनुरोध के लिए स्वर्ण मानक है, डाउनलोड की इस शैली है (जबकि अभी तक पदावनत नहीं) होने की संभावना नहीं पिछले, विशेष रूप से लिंक का उपयोग करने के लिए चर्चा करते हुए, कुकीज़ & रीडायरेक्ट प्रबंध, आदि के लिए कारणों में से एक कारण यह है कि यह कम सुरक्षित है और आम तौर पर इस तरह के उपयोग को प्राधिकरण की आवश्यकता होनी चाहिए। इसके बजाए, सीएसवी के रूप में Google शीट्स को निर्यात करने का वर्तमान स्वीकार्य तरीका Google Drive API का उपयोग कर है।

तो ड्राइव एपीआई क्यों? क्या यह Sheets API के बजाय कुछ नहीं होना चाहिए? खैर, शीट्स एपीआई स्प्रेडशीट -ऑरिएंटेड कार्यक्षमता, यानी डेटा स्वरूपण, कॉलम आकार, चार्ट बनाने, सेल सत्यापन आदि इत्यादि के लिए है, जबकि ड्राइव एपीआई फ़ाइल -ऑरिएंटेड कार्यक्षमता, यानी आयात/निर्यात, प्रतिलिपि, नाम बदलें, आदि

नीचे complete cmd-line solution है। (यदि आप पायथन नहीं करते हैं, तो आप इसे स्यूडोकोड के रूप में उपयोग कर सकते हैं और Google APIs Client Libraries द्वारा समर्थित किसी भी भाषा को चुन सकते हैं।) कोड स्निपेट के लिए, inventory नामक सबसे वर्तमान शीट मानें (उस नाम वाली पुरानी फाइलों को अनदेखा किया जाता है) और DRIVE है एपीआई सेवा समाप्ति बिंदु:

FILENAME = 'inventory' 
SRC_MIMETYPE = 'application/vnd.google-apps.spreadsheet' 
DST_MIMETYPE = 'text/csv' 

# query for latest file named FILENAME 
files = DRIVE.files().list(
    q='name="%s" and mimeType="%s"' % (FILENAME, SRC_MIMETYPE), 
    orderBy='modifiedTime desc,name').execute().get('files', []) 

# if found, export Sheets file as CSV 
if files: 
    fn = '%s.csv' % os.path.splitext(files[0]['name'].replace(' ', '_'))[0] 
    print('Exporting "%s" as "%s"... ' % (files[0]['name'], fn), end='') 
    data = DRIVE.files().export(fileId=files[0]['id'], mimeType=DST_MIMETYPE).execute() 

    # if non-empty file 
    if data: 
     with open(fn, 'wb') as f: 
      f.write(data) 
     print('DONE') 

यदि आपका शीट बड़ी है, आप मात्रा में निर्यात करने के लिए हो सकता है - कैसे करने के लिए कि पर this page देखते हैं। यदि आप आम तौर पर Google एपीआई के लिए नए हैं, तो मेरे पास आपके लिए कुछ (कुछ हद तक दिनांकित) उपयोगकर्ता के अनुकूल intro video है। (उसके बाद 2 वीडियो भी उपयोगी हो सकते हैं।)

संबंधित मुद्दे