Простой способ заставить браузер загружать файл - это сделать такой запрос:
function downloadFile(urlToSend) {
var req = new XMLHttpRequest();
req.open("GET", urlToSend, true);
req.responseType = "blob";
req.onload = function (event) {
var blob = req.response;
var fileName = req.getResponseHeader("fileName") //if you have the fileName header available
var link=document.createElement('a');
link.href=window.URL.createObjectURL(blob);
link.download=fileName;
link.click();
};
req.send();
}
Это открывает всплывающее окно браузера.
Код ниже был протестирован в Python 3.6 и 2.7
(я думаю, это то, что вы ищете)
reader = [['1','2','3'],['11','22','33'],['111','222','333']]
csv_rows = []
title = ['T1','T2','T3']
for row in reader:
csv_rows.extend([ {title[i]:row[i] for i in range(len(title))} ])
print(csv_rows)
Выход
[{'T2': '2', 'T3': '3', 'T1': '1'}, {'T2': '22', 'T3': '33', 'T1': '11'}, {'T2': '222', 'T3': '333', 'T1': '111'}]
Небольшой совет по оптимизации и удобочитаемости: по возможности избегайте выбора индекса.
Если вы выполняете итерации как по индексу, так и по значению итерируемого, избегайте использования range (len (x)) и используете непосредственно enumerate
, это намного быстрее в python и более читабельно.
Улучшение ответа @ balderman:
reader = [['1','2','3'],['11','22','33'],['111','222','333']]
csv_rows = []
title = ['T1','T2','T3']
for row in reader:
csv_rows.extend([{val: row[idx] for idx, val in enumerate(title)}])
print(csv_rows)
Еще лучше и понятнее избегать использования индексов вообще:
reader = [['1','2','3'],['11','22','33'],['111','222','333']]
csv_rows = []
title = ['T1','T2','T3']
for row in reader:
csv_rows.extend([ {t_val: r_val for (t_val, r_val) in zip(title, row)} ])
print(csv_rows)
Еще более компактно (и быстрее):
[ 112]Список и диктовки немного сложны в начале, но если вы думаете о них как о «циклах с положением после», они не такие странные.