python - 通过元组名称将不同命名元组的列表传递给不同的 csv

标签 python csv namedtuple

我有一个程序,我希望在其中记录发生的所有重大变化。例如:每次变量x的值发生变化时,记录变化的时间和变化本身。在程序中有许多这样的更改,并且并非所有都具有相同数量的参数。

我决定使用 namedtuples 来存储每个更改实例,然后将这些 namedtuples 放入单个主数据列表中 - 准备导出到 csv。我使用了元组,因为它们当然是不可变的,这是保存记录的理想选择。下面我试图以尽可能简洁的方式解释我所做和尝试的事情。希望到目前为止我的问题和尝试是清楚的。

所以我有:

data = [] 

作为主存储库,具有以下形式的命名元组:

a_tuple = namedtuple('x_change', ['Time', 'Change'])
another_tuple = namedtuple('y_change', ['Time', 'Change', 'id'])

然后,每次使用以下命令检测到数据更改时,我都可以附加这些命名元组的实例:

data.append(a_tuple(a_time, a_change))
data.append(another_tuple(a_time, a_change, an_id))

如果我然后打印出数据的内容,我将得到如下输出:

x_change(a_time=4, a_change=1)
y_change(a_time=5, a_change=3, an_id = 2)
y_change(a_time=7, a_change=1, an_id = 3)
x_change(a_time=8, a_change=3)

我想做的是按元组名称将这些元组导出到 csv 文件。因此,在上述情况下,我最终会得到以下形式的两个 csv 文件:

name, time, change
x_change, 4, 1
x_change, 8, 3

和;

name, time, change, id
y_change, 5, 3, 2
y_change, 7, 1, 3

到目前为止,我必须设法写入单个 csv,如下所示:

with open ('events.csv', 'w', newline='') as csvfile:
    output = csv.writer(csvfile, delimiter = ',')
    for row in data:
        output.writerow(row)

生成减去元组名称的输出。所以:

4, 1
5, 3, 2
7, 1, 3
8, 3

我也试过:

with open ('events.csv', 'w', newline='') as csvfile:
    output = csv.writer(csvfile, delimiter = ',')
    for row in data:
        output.writerow(str(row))

通过获取的每个字符(仅包括第一行)将文件拆分为 csv 格式,包括元组名称:

x, _, c, h, a, n, g, e, 4, 1

我已经搜索了一个解决方案,但没有找到适合我正在尝试做的事情的任何东西,现在我不知所措。如有任何帮助,我们将不胜感激。

最佳答案

以下方法应该有效。这将获取包含所有命名元组的数据,并首先按元组的类型对其进行排序。然后它将所有条目分组并为每个条目创建一个 CSV 文件。每个 CSV 文件中的第一行包含字段名称:

from collections import namedtuple
from itertools import groupby
import csv

data = [] 

a_tuple = namedtuple('x_change', ['Time', 'Change'])
another_tuple = namedtuple('y_change', ['Time', 'Change', 'id'])

data.append(a_tuple(6, 1))
data.append(a_tuple(2, 1))
data.append(another_tuple(5, 3, 2))
data.append(another_tuple(7, 1, 3))
data.append(a_tuple(5, 2))

data.sort(key=lambda x: type(x).__name__)

for k, g in groupby(data, lambda x: type(x).__name__):
    with open('{}.csv'.format(k), 'w', newline='') as f_output:
        csv_output = csv.writer(f_output)
        rows = list(g)
        csv_output.writerow(['Name'] + list(rows[0]._fields))
        for row in rows:
            csv_output.writerow([type(row).__name__] + list(row))

对于我的数据,这将为您提供两个 CSV 文件,如下所示:

x_change.csv

Name,Time,Change
x_change,6,1
x_change,2,1
x_change,5,2

y_change.csv

Name,Time,Change,id
y_change,5,3,2
y_change,7,1,3

关于python - 通过元组名称将不同命名元组的列表传递给不同的 csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33240205/

相关文章:

sql - Amazon RDS with/SQL Server 不允许从 CSV 源批量插入

python - 如何将 namedtuple 应用于函数?

python - 如何为 std::vector 数据的形状 View 编写 LLDB 合成提供程序

python - 如何组合多个朴素贝叶斯分类器的输出?

python - 将列表列表构建为 csv/Excel 的列和行

python - 使用 python 将 CSV 文件转换为 JSON 文件

python - 命名元组错误

python - 具有 Lambda 值的字典更新所有条目

python - PyCharm 导航到库源 - Typeshed Stubs\unittest 和标准 Python37\Lib\unittest 之间的区别

python - 无法在 Django 1.7 中添加文件