UPD: с VS2017 в Work Tools есть рабочая нагрузка, которая полностью устраняет эту проблему. См. Ответ @SOReader.
Если вы предпочитаете ничего не изменять на сервере сборки, и вы все еще хотите, чтобы проект строился прямо из исходного элемента управления, может быть хорошей идеей поставить требуемые двоичные файлы под контролем источника. Вам нужно будет изменить раздел импорта в файле проекта, чтобы он выглядел следующим образом:
<Import Project="$(SolutionDir)\BuildTargets\WebApplications\Microsoft.WebApplication.targets" />
<Import Condition="false" Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
Первая строка - это фактический импорт из нового местоположения, относящегося к каталогу решений. Второй вариант - отключенная версия (Condition="false"
) исходной строки, которая позволяет Visual Studio по-прежнему считать ваш проект действительным проектом веб-приложений (это трюк, который сам VS 2010 SP1).
Не забудьте скопировать папку C:\Program Files (x86)\Microsoft\VisualStudio\v10.0\WebApplications
в BuildTargets
под вашим контролем источника.
json_normalize
от [1 112] pandas
: test.json
p.open
и df.to_csv
, encoding='utf-8'
может не быть необходимым. pathlib
, библиотека .open
является методом pathlib
import pandas as pd
from pandas.io.json import json_normalize
from pathlib import Path
import json
# set path to file
p = Path(r'c:\some_path_to_file\test.json')
# read json
with p.open('r', encoding='utf-8') as f:
data = json.loads(f.read())
# create dataframe
df = json_normalize(data)
# dataframe view
pk model fields.codename fields.name fields.content_type
22 auth.permission add_logentry Can add log entry 8
23 auth.permission change_logentry Can change log entry 8
24 auth.permission delete_logentry Can delete log entry 8
4 auth.permission add_group Can add group 2
10 auth.permission add_message Can add message 4
# save to csv
df.to_csv('test.csv', index=False, encoding='utf-8')
pk,model,fields.codename,fields.name,fields.content_type
22,auth.permission,add_logentry,Can add log entry,8
23,auth.permission,change_logentry,Can change log entry,8
24,auth.permission,delete_logentry,Can delete log entry,8
4,auth.permission,add_group,Can add group,2
10,auth.permission,add_message,Can add message,4
Этот код должен работать для вас, предполагая, что ваши данные JSON находятся в файле с именем data.json
.
import json
import csv
with open("data.json") as file:
data = json.load(file)
with open("data.csv", "w") as file:
csv_file = csv.writer(file)
for item in data:
fields = list(item['fields'].values())
csv_file.writerow([item['pk'], item['model']] + fields)
JSON может представлять широкий спектр структур данных - «объект» JS примерно похож на dict Python (со строковыми ключами), «массив» JS примерно как список Python и вы можете вкладывать их, если конечные «листовые» элементы являются числами или строками.
CSV может по существу представлять только двухмерную таблицу - необязательно с первой строкой «заголовков», то есть «имен столбцов», что может сделать таблицу интерпретируемой как список dicts, вместо обычной интерпретации, списка списков (опять же, «листовые» элементы могут быть числами или строками).
Таким образом, в общем случае вы не можете переводить произвольную структуру JSON в CSV. В некоторых особых случаях вы можете (массив массивов без дальнейшего вложения; массивы объектов, которые все имеют одинаковые ключи). Какой особый случай, если есть, относится к вашей проблеме? Детали решения зависят от того, какой у вас особый случай. Учитывая тот удивительный факт, что вы даже не упоминаете, какое из них применяется, я подозреваю, что вы, возможно, не учли ограничение, ни один из применимых случаев на самом деле не применяется, и вашу проблему невозможно решить. Но, пожалуйста, уточните!
Во-первых, ваш JSON имеет вложенные объекты, поэтому его обычно нельзя напрямую преобразовать в CSV. Вам нужно изменить это на что-то вроде этого:
{
"pk": 22,
"model": "auth.permission",
"codename": "add_logentry",
"content_type": 8,
"name": "Can add log entry"
},
......]
Вот мой код для генерации CSV из этого:
import csv
import json
x = """[
{
"pk": 22,
"model": "auth.permission",
"fields": {
"codename": "add_logentry",
"name": "Can add log entry",
"content_type": 8
}
},
{
"pk": 23,
"model": "auth.permission",
"fields": {
"codename": "change_logentry",
"name": "Can change log entry",
"content_type": 8
}
},
{
"pk": 24,
"model": "auth.permission",
"fields": {
"codename": "delete_logentry",
"name": "Can delete log entry",
"content_type": 8
}
}
]"""
x = json.loads(x)
f = csv.writer(open("test.csv", "wb+"))
# Write CSV Header, If you dont need that, remove this line
f.writerow(["pk", "model", "codename", "name", "content_type"])
for x in x:
f.writerow([x["pk"],
x["model"],
x["fields"]["codename"],
x["fields"]["name"],
x["fields"]["content_type"]])
Вы получите вывод как:
pk,model,codename,name,content_type
22,auth.permission,add_logentry,Can add log entry,8
23,auth.permission,change_logentry,Can change log entry,8
24,auth.permission,delete_logentry,Can delete log entry,8