Словарь Python для CSV
Я написал код для чтения CSV в словарь python, который отлично работает. Я пытаюсь вернуть словарь в CSV. Я написал следующее:
import csv
itemDict={}
listReader = csv.reader(open('/Users/broberts/Desktop/Sum_CSP1.csv','rU'), delimiter = ',', quotechar='|')
for row in listReader:
fID = row[0]
fClassRange = row[1]
fArea = row[2]
if itemDict.has_key(fID):
itemDict[fID][fClassRange]=fArea
else:
itemDict[fID] = {'5.0 to 5.25':'','5.25 to 5.5':'','5.5 to 5.75':'','5.75 to 6.0':'','6.0 to 6.25':'','6.25 to 6.5':'','6.5 to 6.75':'','6.75 to 7.0':'','7.0 to 7.25':'','7.25 to 7.5':'','7.5 to 7.75':'','7.75 to 8.0':'','8.0 to 8.25':'',}
itemDict[fID][fClassRange]=fArea
listWriter = csv.writer(open('/Users/broberts/Desktop/Sum_CSP1_output.csv', 'wb'), delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
for a in itemDict:
print a
listWriter.writerow(a)
В последнем блоке listWriter ничего не будет записывать в CSV, хотя он будет печатать a. Я считаю, что это имеет какое-то отношение к неупорядоченному словарю. Мне действительно нужно записать fID и каждый из ключей, связанных с каждым fID (fClassRange ex. "От 5.0 до 5.25" ), а затем значение fArea, связанное с каждым fClassRange, в CSV, но я даже не добрался так далеко мой код, так как я не могу понять, как записать даже fID.
Я изучил использование DictWriter
, но я не могу понять, как сказать ему, какие требуемые имена полей.
Ответы
Ответ 1
Писатель по умолчанию ожидает список, поэтому он не будет работать для вас. Чтобы использовать диктофон, просто измените строку listwriter =
на это:
listWriter = csv.DictWriter(
open('/Users/broberts/Desktop/Sum_CSP1_output.csv', 'wb'),
fieldnames=itemDict[itemDict.keys()[0]].keys(),
delimiter=',',
quotechar='|',
quoting=csv.QUOTE_MINIMAL
)
Или вы можете просто установить fieldnames
как fieldnames=['arbitrary','list','of','keys']
, если знаете, какие поля должны быть.
Ответ 2
Пример данных:
mydict = [{"col1": 1000, "col2": 2000}, {"col1": 3000, "col2": 4000}]
Однострочник для преобразования списка диктов в CSV с использованием панд:
import pandas as pd
pd.DataFrame(mydict).to_csv('out.csv', index=False)
Результаты:
col1,col2
1000,2000
3000,4000
Ответ 3
Для потомков:
Вы должны использовать iteritems() для итерации по словарю, поэтому последняя часть становится
for name, values in itemDict.iteritems():
print values
listWriter.writerow(values)
Ответ 4
Это то, что я использую, просто и прекрасно работает для меня.
если у вас есть только один словарь, используйте этот
my_dict = {"tester": 1, "testers": 2}
with open('mycsvfile.csv', 'wb') as f:
w = csv.DictWriter(f, my_dict.keys())
w.writerow(dict((fn,fn) for fn in my_dict.keys()))
w.writerow(my_dict)
$ cat mycsvfile.csv
testers,tester
2,1
Когда у вас есть список словарей, например, что вы получаете от SQL-запросов, вам это нравится.
my_dict = ({"tester": 1, "testers": 2},{"tester": 14, "testers": 28})
with open('mycsvfile.csv', 'wb') as f:
w = csv.DictWriter(f, my_dict[0].keys())
w.writerow(dict((fn,fn) for fn in my_dict[0].keys()))
w.writerows(my_dict)
cat mycsvfile.csv
testers,tester
2,1
28,14
Ответ 5
Самый простой способ
Вы можете преобразовать словарь в Dataframe и записать его в CSV Eg
import pandas as pd
my_dict = {"tester": 1, "testers": 2}
df=pd.DataFrame(my_dict,index=[0])
df.to_csv("path and name of your csv.csv")
выход
tester testers
0 1 2