5

公開されているGoogleスプレッドシートの文書を元にしたCSVファイルを保存する簡単な方法をお探しですか?公開されているため、直接リンクを介してアクセスできます(下の例で目的に応じて変更されています)。GoogleスプレッドシートファイルをPython 3(または2)からCSV形式で保存するにはどうすればよいですか?

すべてのブラウザは、リンクを開始するとすぐにcsvファイルを保存するよう促します。

どちら:

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コンテンツが、印刷何でも。

は(この他の記事を読んだ後、第二版を試してみました:​​。)

私が間違っているのかについての任意のアイデア?私はGoogleアカウントからログアウトしていますが、それがあれば価値がありますが、これは私が試したブラウザからはうまくいきます。私が理解する限り、Google Docs APIはまだPython 3に移植されておらず、私の小さなプロジェクトの「おもちゃ」の大きさを個人的に利用することはできません。私はそれを回避することができます。

2回目の試行では、スクリプトからの入力と考えられていたかもしれないと考えていたので、私は 'User-Agent'を残しました(b/cは識別情報がありません)違い。

答えて

4

Googleは、一連のCookie設定302リダイレクトを使用して最初のリクエストに応答します。リクエスト間でクッキーを保存して再送信しないと、ログインページにリダイレクトされます。

したがって、問題はUser-Agentヘッダーではなく、デフォルトでurllib.request.urlopenはCookieを保存しませんが、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') 

はバニラPythonでそれを行うにはどのように示された、私は今、と言うことでしょうRight Way™は、これを最も優れたものにすることです。requests libraryextremely well documentedであり、これらの種類の作業を非常に楽しいものにします。一行は、より明確に自分の意図を表現すること

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

requestsライブラリを使用して上記と同じcsv_contentを得るために例えば

は、同じくらい簡単です。書きやすく、読みやすい。あなた自身とあなたのコードベースを共有する他の誰もが好きで、ちょうどrequestsを使ってください。

+0

ありがとう、本当にありがとう! –

2

requestsライブラリはPythonからのHTTPリクエストのゴールドスタンダードですが、このスタイルのダウンロードはまだ使用されていませんが、特にリンクの使用、クッキーの管理&のリダイレクトなどがあります。の理由の1つは、がリンクを優先しているという理由のほうが安全性が低く、そのようなアクセスには承認が必要であるということです。代わりに、CSVとしてGoogleスプレッドシートをエクスポートする現在受け入れられている方法は、Google Drive APIを使用するです。

なぜドライブAPIですか?これは代わりにSheets APIのためのものではないと思われますか?ドライブAPIがファイルの機能、つまりインポート/エクスポートのためのものであるのに対して、Sheets APIはスプレッドシート-データ形式、列のサイズ変更、チャートの作成、セルの検証などです。コピー、名前変更など

以下はcomplete cmd-line solutionです。 (Pythonを使用しない場合は、擬似コードとして使用し、Google APIs Client Librariesでサポートされている言語を選択できます)。コードスニペットの場合は、inventoryという名前の最新のシートを想定します(その名前を持つ古いファイルは無視されます)。DRIVEはAPIサービスエンドポイント:

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 APIを初めてお使いになる場合は、ユーザーフレンドリーなintro videoが付いています。それ以降の2つの動画もあります。

関連する問題