我是使用Python的AWS新手,我正在尝试学习boto API但是我注意到Python有两个主要的版本/包.那将是boto和boto3.
AWS boto和boto3库有什么区别?
我正确设置了$ AWS_ACCESS_KEY_ID和$ AWS_SECRET_ACCESS_KEY环境变量,并运行此代码:
import boto
conn = boto.connect_s3()
Run Code Online (Sandbox Code Playgroud)
并得到此错误:
boto.exception.NoAuthHandlerFound: No handler was ready to authenticate. 1 handlers were checked. ['HmacAuthV1Handler']
Run Code Online (Sandbox Code Playgroud)
发生了什么?我不知道从哪里开始调试.
似乎boto没有从我的环境变量中获取值.如果我将密钥id和密钥作为参数传递给连接构造函数,这可以正常工作.
我查看了我期望能够满足我的需求的标准文档(Apache Arrow和Pandas),但我似乎无法弄清楚。
我最了解Python,所以我想使用Python,但这不是严格要求。
我需要将 Parquet 文件从一个位置(URL)移动到另一个位置(Azure 存储帐户,在本例中使用 Azure 机器学习平台,但这与我的问题无关)。
这些文件太大而无法简单地执行pd.read_parquet("https://my-file-location.parquet"),因为这会将整个文件读取到一个对象中。
我认为必须有一种简单的方法来创建文件对象并逐行流式传输该对象 - 或者可能逐列块。就像是
import pyarrow.parquet as pq
with pq.open("https://my-file-location.parquet") as read_file_handle:
with pq.open("https://my-azure-storage-account/my-file.parquet", "write") as write_filehandle:
for next_line in read_file_handle{
write_file_handle.append(next_line)
Run Code Online (Sandbox Code Playgroud)
我知道它会有点不同,因为 Parquet 主要是为了以柱状方式访问。也许我会传递某种配置对象,它指定感兴趣的列,或者可以在一个块或类似的东西中抓取多少行。
但主要的期望是有一种方法可以访问 parquet 文件,而无需将其全部加载到内存中。我怎样才能做到这一点?
FWIW,我确实尝试过只使用 Python 的标准open函数,但我不确定如何使用openURL 位置和字节流。如果可以通过跳过open任何 Parquet 特定的内容来完成此操作,那也很好。
一些评论建议使用类似 bash 的脚本,例如这里。如果没有别的办法我可以使用这个,但它并不理想,因为:
我有一个简单的上传表单,其中包含一个图像FileField:
def post(request):
if request.user.is_authenticated():
form_post = PostForm(request.POST or None, request.FILES or None)
if form_post.is_valid():
instance = form_post.save(commit=False)
instance.user = request.user
instance.save()
return HttpResponseRedirect('/home/')
else:
form_post = PostForm()
context = {
'form_post': form_post,
}
return render(request, 'post/post.html', context)
else:
return HttpResponseRedirect("/accounts/signup/")
Run Code Online (Sandbox Code Playgroud)
当用户向表单添加图像时,它会触发以下 JS 函数:
$('input#id_image').on('change', function(e) {...}
Run Code Online (Sandbox Code Playgroud)
这给出了图像的预览。这是我希望将图像上传到我的媒体文件夹目录的地方(我使用的是 S3 存储)。默认情况下,当用户提交表单时上传图像,但我希望它在$('input#id_image').on('change'触发后立即上传。
到目前为止,我所做的是InMemoryUploadedFile在我的视图中以格式检索图像:
$('input#id_image').on('change', function(e) {
var formData = new FormData();
formData.append('image', $('input[type=file]')[0].files[0]);
formData.append('csrfmiddlewaretoken', $("input[name='csrfmiddlewaretoken']").val());
$.ajax({
url: '/upload_image/',
data: formData,
type: 'POST',
contentType: false,
processData: false, …Run Code Online (Sandbox Code Playgroud) 我有一个文件 URL 列表,它们是下载链接。我已经编写了 Python 代码来将文件下载到我的计算机上。问题来了,列表中有大约 500 个文件,Chrome 在下载了大约 50 个文件后变得没有响应。我最初的目标是将我下载的所有文件上传到 s3 中的 Bucket。有没有办法让文件直接转到S3?这是我到目前为止所写的内容:
import requests
from itertools import chain
import webbrowser
url = "<my_url>"
username = "<my_username>"
password = "<my_password>"
headers = {"Content-Type":"application/xml","Accept":"*/*"}
response = requests.get(url, auth=(username, password), headers = headers)
if response.status_code != 200:
print('Status:', response.status_code, 'Headers:', response.headers, 'Error Response:', response.json())
exit()
data = response.json()
values = list(chain.from_iterable(data.values()))
links = [lis['download_link'] for lis in values]
for item in links:
webbrowser.open(item)
Run Code Online (Sandbox Code Playgroud) 这里有一个关于原始 boto 上传的很好的问题和答案:
其中有一个回调:
k = Key(bucket)
k.key = 'my test file'
k.set_contents_from_filename(testfile,
cb=percent_cb, num_cb=10)
Run Code Online (Sandbox Code Playgroud)
虽然我看到 boto3 包需要回调:
我没有看到与 num_cb 参数等效的内容。如何获得upload_fileobj使用 boto3 的进度表?
s3.upload_fileobj(data, 'mybucket', 'mykey')
Run Code Online (Sandbox Code Playgroud)