我正在尝试从字典中创建一个csv文件,其中每个值都是一个数字列表。
<div id="navigation" class="clearfix">
<ul id="nav" class="menu responsiveSelectFullMenu sf-js-enabled sf-arrows">
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home current-menu-item page_item page-item-4 current_page_item menu-item-1114"><a href="" aria-current="page">Home</a></li>
<li class="megamenu columns-5 menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-1103"><a href="#" class="sf-with-ul">eLibrary</a>
<ul class="sub-menu" style="display: none;">
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-1132"><a href="" class="sf-with-ul">Research</a>
<ul class="sub-menu" style="display: none; left: 203px; top: 0px;">
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1152"><a href="">General Research</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1151"><a href="">Business, Finance & Job Searching</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1150"><a href="">Consumer & DIY Information</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1149"><a href="">Family History</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1148"><a href="">Reading Resources</a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1095"><a href="">Teens</a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1097"><a href="">Kids</a></li>
</ul>
</li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-1131"><a href="" class="sf-with-ul">eBooks & eAudiobooks</a>
<ul class="sub-menu" style="display: none; left: 203px; top: 0px;">
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-4833"><a href="">Cloud Library</a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-4834"><a href="">Overdrive</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-4851"><a href="">Loanable Kindles</a></li>
</ul>
</li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-4695"><a href="" class="sf-with-ul">Online Learning</a>
<ul class="sub-menu" style="display: none; left: 203px; top: 0px;">
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-4703"><a href="">Rosetta Stone</a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-4696"><a href="">Gale Courses</a></li>
</ul>
</li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-1110"><a href="" class="sf-with-ul">eMagazines</a>
<ul class="sub-menu" style="display: none; left: 203px; top: 0px;">
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1167"><a href="">RB Digital</a></li>
</ul>
</li>
</ul>
</li>
<li class="megamenu columns-3 menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-1104"><a href="#" class="sf-with-ul">Your Library</a>
<ul class="sub-menu" style="display: none;">
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-1140"><a href="" class="sf-with-ul">What We Offer</a>
<ul class="sub-menu" style="display: none; left: 203px; top: 0px;">
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-5176"><a href="">Library Rewards</a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-2377"><a href="">My Library Account</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1157"><a href="">Your Library Card</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1158"><a href="">Library Collection</a></li>
</ul>
</li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-1138"><a href="" class="sf-with-ul">Reference & Reader Resources</a>
<ul class="sub-menu" style="display: none; left: 203px; top: 0px;">
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-5308"><a href="">Hot Books</a></li>
</ul>
</li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-1134"><a href="" class="sf-with-ul">Other Services</a>
<ul class="sub-menu" style="display: none; left: 203px; top: 0px;">
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-4510"><a href="">Passports</a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1107"><a href="">Pay Online</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-5539"><a href="">Museums</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1156"><a href="">Test Proctoring</a></li>
</ul>
</li>
</ul>
</li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-1113"><a class="sf-with-ul">About</a>
<ul class="sub-menu" style="display: none;">
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-1127"><a href="" class="sf-with-ul">Library Board of Trustees</a>
<ul class="sub-menu" style="display: none; left: -203px; top: 0px;">
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-5540"><a href="">Certified Results of April 2 Election</a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-5412"><a href="">Library Budget Process</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-4296"><a href="">Library Board Minutes & Agendas</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-3904"><a href="">Library Board Sponsorship Campaign</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1170"><a href="">Financials</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1129"><a href="">Policies</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1142"><a href="">Freedom of Information Act</a></li>
</ul>
</li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-5110"><a href="">Library Volunteer Program</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-4361"><a href="">Donations</a></li>
</ul>
</li>
</ul>
</div>
我希望csv像这样:
example = {"A" : [1,2,3], "B" : [1], "C": [4,5,6,7,8,9]}
我尝试做类似的事情:
A,B,C
1,1,4
2, ,5
3, ,6
, ,7
, ,8
, ,9
但是最终在excel中出现了这样的情况:
with open("example.csv", "w", newline='') as f:
headers = example.keys()
writer = csv.DictWriter(f, fieldnames=headers)
writer.writeheader()
writer.writerow(example)
我可以考虑做的一些可能的事情是在较小的列表值上添加一个空格,使其与最长的列表值具有相同的长度,然后基于索引值进行zip,然后将每个元组都排成一行。如果我以这种方式这样做,是否会找到一种有效的方法来找到最大的列表大小并在没有很多for循环和附加的情况下附加空白?列表大小可以达到65000。此外,字典中的条目数是可变的,这意味着它永远不会设置常量。
答案 0 :(得分:2)
仅带有标准库(假设python 3.7+-用于保留标头中键的正确顺序所必需的dict的顺序保留功能)
import csv
from itertools import zip_longest
example = {"A" : [1,2,3], "B" : [1], "C": [4,5,6,7,8,9]}
keys, values = zip(*example.items())
data = (dict(zip(keys, row)) for row in zip_longest(*values, fillvalue=''))
with open('output.csv', 'w') as f:
wrtr = csv.DictWriter(f, fieldnames=keys)
wrtr.writeheader()
wrtr.writerows(data)
编辑:对于3.7 *之前的python版本,您不能依赖保留顺序,因此您需要按所需顺序显式提供标头(即,它不能来自dict.keys())
import csv
from itertools import zip_longest
header = ['A', 'B', 'C']
example = {"A" : [1,2,3], "B" : [1], "C": [4,5,6,7,8,9]}
values = (example.get(key, []) for key in header)
data = (dict(zip(header, row)) for row in zip_longest(*values, fillvalue=''))
with open('output.csv', 'w') as f:
wrtr = csv.DictWriter(f, fieldnames=header)
wrtr.writeheader()
wrtr.writerows(data)
答案 1 :(得分:0)
如果您可以使用pandas库,请尝试以下操作,
import pandas as pd
example = {"A" : [1,2,3], "B" : [1], "C": [4,5,6,7,8,9]}
df = pd.DataFrame({ key:pd.Series(value) for key, value in example.items() })
df.to_csv('example_dict.csv', index=False)
答案 2 :(得分:0)
解决方案之一是将字典转换为数据帧,然后将其用于csv文件,但是请记住,仍然没有办法为非等长数组赋空白值,它将是NaN。
import pandas as pd
df = pd.DataFrame.from_dict(example, orient='index')
df = df.T # Transpose dataframe to get same orientation as required
答案 3 :(得分:0)
尝试一下:
import csv
from itertools import zip_longest
example = {"A" : [1,2,3], "B" : [1], "C": [4,5,6,7,8,9]}
v = list(zip_longest(example['A'], example['B'], example['C'], fillvalue=' '))
print(v)
with open("example.csv", "w", newline='') as f:
headers = example.keys()
writer = csv.DictWriter(f, fieldnames=headers)
writer.writeheader()
for row in v:
d = {header:value for header, value in zip(headers, row)}
writer.writerow(d)
example.csv输出:
A,B,C
1,1,4
2, ,5
3, ,6
, ,7
, ,8
, ,9