【问题标题】:Append a list of strings to first column in a csv将字符串列表附加到 csv 中的第一列
【发布时间】:2018-11-10 00:08:45
【问题描述】:

我有以下格式的列表:

test_data = [[0.09792, 0.04583, 0.01667, 0.05208, 0.02917, 0.0375, 0.03958, 0.11042, 0.03542, 0.01667, 0.13125, 0.01667, 0.01875, 0.04583, 0.1, 0.05833, 0.06042, 0.00625, 0.03333, 0.04792], 
            [0.0709, 0.04104, 0.0398, 0.06343, 0.02239, 0.03109, 0.07463, 0.04851, 0.01493, 0.05597, 0.11194, 0.0597, 0.04104, 0.03731, 0.02612, 0.0995, 0.05224, 0.00373, 0.02985, 0.07587], 
            [0.1232, 0.0704, 0.0128, 0.056, 0.024, 0.032, 0.0528, 0.0656, 0.0256, 0.0384, 0.1088, 0.0368, 0.0352, 0.0352, 0.0688, 0.0528, 0.0336, 0.0096, 0.0384, 0.08]

这只是包含更多子列表的完整数据的子集。我使用以下代码将数据写入 csv,如下所示:

import csv
import sys
with open("my_data.csv", "wb") as my_csv:    
    w = csv.writer(my_csv, sys.stdout)
    w.writerow(column_headers)
    w.writerows(zip(*test_data))

“column_headers”变量是一个字符串列表,长度为 24 个元素,写为第一行以用作列标识符。它的格式为:

column_headers = ['header_1', 'header_2', ....., 'header_24']

输出的 csv 表如下所示:

header_1,  header_2,  header_3, ...., header_24
0.0979,    0.0709,    0.1232,   ...., 0.0688
0.0458,    0.0410,    0.0704,   ...., 0.0527
0.0166,    0.0398,    0.0128,   ...., 0.0389

我想添加一个字符串列表作为新的第一列,它将表示行 id,因此表格格式如下:

row_id = ['row_id', 'a', 'b', 'c'...., 'k']

row_id,  header_1,  header_2,  header_3, ...., header_24
a        0.0979,    0.0709,    0.1232,   ...., 0.0688
b        0.0458,    0.0410,    0.0704,   ...., 0.0527
c        0.0166,    0.0398,    0.0128,   ...., 0.0389

我使用以下代码来做到这一点:

for ind, line in enumerate(fileinput.input("my_data.csv", inplace = True)):
    sys.stdout.write("{},{}\n".format(line.rstrip(), row_id[ind]))

不幸的是,数据以不同的格式出现。字符串列表位于最后一列。它看起来像这样:

    header_1,  header_2,  header_3, ...., header_24,  row_id
    0.0979,    0.0709,    0.1232,   ...., 0.0688,     a
    0.0458,    0.0410,    0.0704,   ...., 0.0527,     b
    0.0166,    0.0398,    0.0128,   ...., 0.0389,     c

如何调整上面的代码以根据需要将 row_id 放在第一列?

感谢您的宝贵时间

【问题讨论】:

  • 你试过这个sys.stdout.write("{},{}\n".format(row_id[ind], line.rstrip())
  • @risabh.bhardwaj 就这么简单。谢谢!
  • @rishabh.bhardwaj,你介意发布你的答案,即使它很简单。我想对你的回应投赞成票。再次感谢

标签: python-2.7 list csv


【解决方案1】:

这只是交换 2 个参数的顺序!感谢 cmets 中的 @rishabh.bhardwaj 为我的原始帖子。见下文:

for ind, line in enumerate(fileinput.input("my_data.csv", inplace = True)):
    sys.stdout.write("{},{}\n".format(row_id[ind], line.rstrip())

【讨论】:

    【解决方案2】:

    试试这个:

    for ind, line in enumerate(fileinput.input("my_data.csv", inplace = True)):
        sys.stdout.write(f"{row_id[ind]},{line.rstrip()}\n")
    

    【讨论】:

    • 莎丽您好,感谢您的建议。我调整如下(一定是错字): {for ind, line in enumerate(fileinput.input("my_data.csv", inplace = True)): sys.stdout.write("{row_id[ind]},{ line.rstrip()}\n")} 差不多了,但是这个字符串 "{row_id[ind]}" 也打印在其他行。
    • 您好,我不确定如何在 cmets 中格式化代码 sn-ps。我的评论看起来有点乱。任何建议都会很棒。谢谢
    • 太好了,很高兴听到这个消息,在评论中格式化代码:在代码前后使用这个字符 {`} => `code` : code
    【解决方案3】:
    sys.stdout.write("{},{}\n".format(row_id[ind], line.rstrip()) 
    

    【讨论】:

    • 这个答案出现在 SO.. 的低质量帖子中。你能在你的答案中添加任何评论吗?解释你的逻辑,并对你的代码打算做什么做一点评论。这将有助于 OP,但它也将作为未来用户的评论
    猜你喜欢
    • 2018-09-13
    • 2012-12-05
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 2017-08-06
    • 1970-01-01
    • 2016-07-03
    相关资源
    最近更新 更多