如何用python csvwriter在单独的单元格中编写?

sauutmhj  于 2023-01-06  发布在  Python
关注(0)|答案(3)|浏览(111)

我正在读取一系列文件,并将它们和它们的参数写入列表中,然后我想创建一个csv,如下所示:
| 文件1|参数A1|参数A2||
| - ------| - ------| - ------| - ------|
| 文件2|参数P1|参数P2|参数P3|
我的代码能得到什么:
| file1参数A参数A2|
| - ------|
| file2参数P1参数P2参数P3|
我怎样才能把每个参数都放到它自己的单元格里呢?任何帮助都很感激。有趣的是,如果我只使用一个文件运行代码-参数放在不同的单元格里。

import csv

files = ['f1', 'f2']
params_a = ['a1', 'a2']
params_p = ['p1', 'p2', 'p3']

with open ('csv.csv', 'a') as csvfile:
        csvwriter = csv.writer(csvfile, delimiter = ',')
        for file in files:
            csvfile.write('\n%s\t' % (file) )
            for parameter_a in params_a:
                csvfile.write('%s\t' % (parameter_a))
            for parameter_p in params_p:
                csvfile.write('%s\t' % (parameter_p))

我试着玩delemeter,其他参数和行尾,但它变得更糟。不知道是什么打破了多个写作操作的"风格"。
UPD:更新表格以匹配代码样本

qc6wkl3g

qc6wkl3g1#

要根据您的问题编写CSV,您可以使用以下示例:

import csv

files = ['f1', 'f2']
params_a = ['a1', 'a2']
params_p = ['p1', 'p2', 'p3']

with open('data.csv', 'w') as f_out:
    writer = csv.writer(f_out)

    # write header
    writer.writerow(['Column A', 'Column B', 'Column C'])

    # write rows
    for f, p1, p2 in zip(files, params_a, params_p):
        writer.writerow([f, p1, p2])

这将写入具有以下内容的data.csv

Column A,Column B,Column C
f1,a1,p1
f2,a2,p2
23c0lvtd

23c0lvtd2#

根据您提供的代码,最直接的答案是:

files = ["f1", "f2"]
params_a = ["a1", "a2"]
params_p = ["p1", "p2", "p3"]

with open("output_manual.csv", "a", newline="") as csvfile:
    csvwriter = csv.writer(csvfile)

    row = [files[0]] + params_a
    csvwriter.writerow(row)

    row = [files[1]] + params_p
    csvwriter.writerow(row)

输出:

f1,a1,a2
f2,p1,p2,p3

params_a属于文件"f1",params_p属于"f2",这似乎是您需要手动编码的特殊知识。
如果您的数据实际上是这样的:

files = [
    "f1",
    "f2",
]

params = [
    ["a1", "a2"],
    ["p1", "p2", "p3"],
]

然后你可以这样做:

with open("output_mine.csv", "w", newline="") as f_out:
    writer = csv.writer(f_out)
    
    for i, file in enumerate(files):
        row = [file] + params[i]
        writer.writerow(row)

如果愿意,您还可以动态调整标题大小:

max_param_len = 0
for param in params:
    if len(param) > max_param_len:
        max_param_len = len(param)

header = ["File"]
for i in range(max_param_len):
    header += [f"Param_{i+1}"]

然后插入:

...
writer = csv.writer(f_out)
writer.writerow(header)
...

输出:

File,Param_1,Param_2,Param_3
f1,a1,a2
f2,p1,p2,p3

您的数据也可以如下所示,类似的操作也会起作用:

file_param_map = {
    "f1": ["a1", "a2"],
    "f2": ["p1", "p2", "p3"],
}
lymnna71

lymnna713#

import csv

with open('params_test', 'w') as csv_file:
    files = ['f1', 'f2']
    params_a = ['a1', 'a2']
    params_p = ['p1', 'p2', 'p3']
    # Find the max number of columns needed.
    col_max = max(len(params_a), len(params_p))
    c_writer = csv.writer(csv_file)
    for p in [params_a, params_p]:
        # If number of columns is <  the max number pad with empty strings
        if len(p) < col_max:
             for l in range(col_max - len(p)):
                 p.append('')
    # Add the file name to start of params* list. Then write out row.
    params_a.insert(0, files[0])
    c_writer.writerow(params_a)
    params_p.insert(0, files[1])
    c_writer.writerow(params_p)

cat params_test
f1,a1,a2,
f2,p1,p2,p3

相关问题