【问题标题】:How to create csv file with dictionary key containing string as well dictionary key containing list?如何使用包含字符串的字典键以及包含列表的字典键创建 csv 文件?
【发布时间】:2021-01-21 12:04:21
【问题描述】:
name = {} 

name["one"] = "onestring"
name["two"] = "twostring"
name["three"] = [1, 2, 3, 4]
name["four"] = ["string", "hello"]

Expected output should be like

one            two           three      four

onestring    twostring        1         string
                              2         hello
                              3
                              4

如何创建上述格式的 csv 文件?字典值有一些普通的字符串值,一些有列表值。如何创建上述格式的csv??

【问题讨论】:

标签: python python-3.x list csv dictionary


【解决方案1】:

你可以这样做:

import csv

name = {'one': 'onestring', 'two': 'twostring', 'three': [1, 2, 3, 4], 'four': ['string', 'hello']}

# Be sure types are str or list only
assert(all(type(x) in (str, list) for x in name.values()))

csv_filename = "names.csv"

# Get length of the biggest list
max_length = 0
for key in name:
    value = name[key]
    if type(value) is list:
        list_length = len(value)
        if list_length > max_length:
            max_length = list_length


# Replace strings and lists by only lists, of equal length
equal_lengths_dict = dict()
for key in name:
    value = name[key]
    if type(value) is str:
        replacement_list = [""] * max_length
        replacement_list[0] = value
        equal_lengths_dict[key] = replacement_list
    elif type(value) is list:
        value_length = len(value)
        if value_length < max_length:
            number_empty_strings_to_add = max_length - value_length
            empty_strings_to_add = [""] * number_empty_strings_to_add
            replacement_list = value + empty_strings_to_add
            equal_lengths_dict[key] = replacement_list
        elif value_length == max_length:
            equal_lengths_dict[key] = value
        else:
            print("error")
    else:
        print("error")


# Get field names (header row of csv)
fieldnames = list(name.keys())

# Get values that will be on the same rows
csv_rows = list()
# Csv header
csv_rows.append(fieldnames)
# Other rows
list_of_values = equal_lengths_dict.values()
for index in range(max_length):
        one_row = list()
        for value in list_of_values:
            one_row.append(value[index])
        csv_rows.append(one_row)


with open(csv_filename, "w", newline="") as f:
    writer = csv.writer(f, delimiter="\t")
    writer.writerows(csv_rows)

您将不得不添加一些检查和测试。

也许您可以将问题的标题重命名为:“将字典写入 csv 文件,其中键/值对代表列并且具有不等长度的值(字符串和可变长度列表)”。

【讨论】:

  • 是的,这段代码的输出就是您编写的预期输出。您能否提供比“不,它不起作用”更多的信息,以便我可以帮助您?
  • 继续使用 stackoverflow 的好处是它可以帮助其他人。
  • 你的代码输出是 onetwothreefour onestringtwostring1string 2hello 3 4
  • 但我想要像我在我的问题中发布的输出......
  • 尝试阅读 Pranav Hosangadi 在他的评论中所说的话。如果您愿意,可以将预期输出发布为逗号分隔的 csv,以便更清晰。
【解决方案2】:

一个简短的解决方案(主要来自这里Creating dataframe from a dictionary where entries have different lengths(重复?)):

import pandas as pd

name = {}

name["one"] = "onestring"
name["two"] = "twostring"
name["three"] = [1, 2, 3, 4]
name["four"] = ["string", "hello"]

df = pd.DataFrame(dict([(k, pd.Series(v)) for k, v in name.items() ]))

df.to_csv("tmp.csv")

print(df)

输出:

         one        two  three    four
0  onestring  twostring      1  string
1        NaN        NaN      2   hello
2        NaN        NaN      3     NaN
3        NaN        NaN      4     NaN

【讨论】:

  • 是的,这是可行的,另一件事是我们可以这样做 pd.DataFrame.from_dict(name) 并用空值替换重复项
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-15
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 2016-02-03
  • 1970-01-01
  • 2015-11-12
相关资源
最近更新 更多