在Dropbox上读取CSV文件而不下载

时间:2018-09-24 07:33:22

标签: dropbox dropbox-api dropbox-sdk

我正在开发一个应用程序,用户可以在其中提供投递箱文件和访问令牌的路径,并查看文件的内容。是否可以只读取文件内容而不实际下载文件。

import dropbox
import tempfile
import csv

dbx = dropbox.Dropbox(<access_token>)

metadata, f = dbx.files_download('/test/MOCK_DATA.csv')

filename = tempfile.NamedTemporaryFile(suffix='.csv').name

with open(filename, 'wb') as file:
  file.write(f.content)

with open(filename) as file:
  csv_reader = csv.reader(file, delimiter=',')
line_count = 0
for row in csv_reader:
  if line_count == 0:
    print(f'Column names are {", ".join(row)}')
    line_count += 1
  else:
    print(row)
    line_count += 1
print(f'Processed {line_count} lines.')

目前,我只能阅读内容,但只能在下载后阅读。

1 个答案:

答案 0 :(得分:1)

使用files_download是使用Dropbox Python SDK访问文件数据的正确方法。然后在您的代码中将文件数据写入本地文件,但这不是必需的。

csv.reader方法记录为:

  

csvfile可以是支持迭代器协议的任何对象,并且每次调用其next()方法时都会返回一个字符串-文件对象和列表对象均适用。

因此您可以执行以下操作:

import dropbox
import csv

dbx = dropbox.Dropbox(<access_token>)

metadata, f = dbx.files_download('/test/MOCK_DATA.csv')

csv_reader = csv.reader(f.content.decode().splitlines(), delimiter=',')

line_count = 0
for row in csv_reader:
    if line_count == 0:
        print(f'Column names are {", ".join(row)}')
        line_count += 1
    else:
        print(row)
        line_count += 1

print(f'Processed {line_count} lines.')