2013-05-21 32 views
5

Tôi đang làm việc trên tập lệnh đơn giản bằng Python có thể tải xuống và xuất tất cả các tệp từ Dịch vụ Drive miền của Google Apps. Tôi đã có thể tạo phiên Drive bằng tài khoản dịch vụ và tôi nhận được kết xuất JSON từ truy vấn danh sách. Tôi cũng xác định chức năng tải về theo bài viết này:Cách tải xuống tệp từ API Drive bằng cách sử dụng tập lệnh Python

https://developers.google.com/drive/manage-downloads

Vấn đề là chức năng này trở lại một đầu ra JSON gọi là nội dung, nhưng tôi không thể tìm ra cách để lưu trữ các tập tin cục bộ trên HDD. Tôi đã nhìn vào CURL nếu nó có thể được sử dụng bên trong kịch bản Python và tìm thấy urllib/urllib2 nên được sử dụng tương tự như CURL. Nhưng nếu tôi cố gắng sử dụng urllib2 để đọc các tập tin từ xa bằng cách:

remote_file = urllib2.urlopen(download_url).read() 

tôi nhận được 401 Lỗi Unathorized.

Vì vậy, có vẻ như urllib2 đang hoạt động nhưng không sử dụng thông tin đăng nhập được lưu trữ.

Vậy làm cách nào để tạo truy vấn được ủy quyền bằng cách sử dụng urllib/2? Hoặc đúng cách để lưu trữ tệp cục bộ từ bên trong tập lệnh là gì? Có một số thư viện khác hoặc thư viện cụ thể khác của Google có thể giúp tôi lưu trữ tệp cục bộ không?

Xin cảm ơn trước.

EDIT: Tôi đang sử dụng Thư viện ứng dụng API của Google. Vấn đề là hàm download_file trả về một số đầu ra JSON nhưng tôi không thể lưu tệp vào bộ nhớ cục bộ.

tôi đã cố gắng một cái gì đó như thế này:

def download_file(service, drive_file): 
    """Download a file's content. 

    Args: 
      service: Drive API service instance. 
      drive_file: Drive File instance. 

    Returns: 
      File's content if successful, None otherwise. 
    """ 
    download_url = drive_file.get('downloadUrl') 
    if download_url: 
      resp, content = service._http.request(download_url) 
      if resp.status == 200: 
        print 'Status: %s' % resp 
        #return content 
        title = drive_file.get('title') 
        path = './data/'+title 
        file = open(path, 'wb') 
       # remote_file = urllib2.urlopen(download_url).authorize().read() 
        file.write(content.read()) 
      else: 
        print 'An error occurred: %s' % resp 
        return None 
    else: 
      # The file doesn't have any content stored on Drive. 
      return None 

Điều này tạo ra các tập tin trên ổ cứng, nhưng nó không thành công khi cố gắng đọc nội dung. Tôi không biết cách xử lý nội dung phù hợp để ghi vào đĩa cục bộ.

EDIT2:

Ok, vì vậy tôi cuối cùng cũng tìm ra điều đó. Sai lầm của tôi là tôi đã cố gắng sử dụng hàm read() trên nội dung. Tôi chỉ phải sử dụng file.write (nội dung).

Trả lời

6

Bạn có thể dùng thử tập lệnh này từ the article. Và hãy nhớ sử dụng Google APIs Client Library for Python.

from apiclient import errors 
# ... 

def download_file(service, drive_file): 
    """Download a file's content. 

    Args: 
    service: Drive API service instance. 
    drive_file: Drive File instance. 

    Returns: 
    File's content if successful, None otherwise. 
    """ 
    download_url = drive_file.get('downloadUrl') 
    if download_url: 
     resp, content = service._http.request(download_url) 
    if resp.status == 200: 
     print 'Status: %s' % resp 
     return content 
    else: 
     print 'An error occurred: %s' % resp 
     return None 
    else: 
    # The file doesn't have any content stored on Drive. 
    return None 
+2

Cảm ơn bạn đã trả lời, thực sự đây chính xác là những gì tôi đang sử dụng. Nhưng vấn đề là hàm này trả về nội dung chỉ là một đầu ra JSON, nhưng tôi không thể tìm ra cách lưu tệp vào bộ nhớ cục bộ (HDD). – Beneato

0

Dưới mã giúp lưu nội dung tệp trong tệp cục bộ. Chỉ cần thay thế đường dẫn mở rộng của tệp & trong mã bên dưới.

if download_url: 
    resp, content = service._http.request(download_url) 
    if resp.status == 200: 
     print ('Status: %s' % resp) 
     title = file.get('title') 
     path = './data/'+title+".csv" 
     file1 = open(path, 'wb') 
     file1.write(content) 
    else: 
     print ('An error occurred: %s' % resp) 
     return None 
else: 
    # The file doesn't have any content stored on Drive. 
    return None