【问题标题】:Python loop to write across columns in CSVPython循环在CSV中跨列写入
【发布时间】:2011-12-14 05:25:06
【问题描述】:

我正在尝试按如下方式编写 csv:data[0][0] 应该在第 1 行 A 列中,data[0][1] 应该在第 1 行 B 列中,data[1][0 ] 应该在第 2 行的 A 列中,data[1][1] 应该在第 2 行的 B 列中,依此类推。

如果我使用以下代码之类的低效代码,我可以按预期写入 csv。

                for i in range(0, len(data)-lg):
                    writer.writerow([data[i][0], data[i][1], data[i][2],...])

我真的需要类似下面的代码。但是,这段代码将所有内容都写在 A 列中。如何修改它以实现我的目标?谢谢。

            for i in range(0, len(data)-lg):
                for j in range(0, lg+6):
                    writer.writerow([data[i][j]])

【问题讨论】:

    标签: python csv


    【解决方案1】:

    我认为这样做的惯用方式是这样(不完全理解您的 lg 变量):

    num_cols = lg + 6
    for row in data:
        writer.writerow(row[:num_cols])
    

    如果您不对循环中的行进行任何处理,则可以更简洁地进行:

    writer.writerows(data)
    

    编辑 1 根据解释 lg 变量的评论更新

    【讨论】:

    • 谢谢。 lg 是一个介于 10 和 30 之间的数字。len(data) 很容易达到 10,000+。从某种意义上说,lg(实际上是 lg+6)是 csv 将拥有的列数。因此,将有 10,000+ 行和 lg+6 列。 lg 很重要,因为它与代码中的其他循环相关联。在发布这个问题之前,我尝试了 Dan D. 的解决方案,但问题是数据中的每一行看起来像这样:['blah', '11/12/2011', 6, 7, 8, 9]。因此,当将行写入 csv 时,它会写入一个带有括号和单引号的单元格中。我需要将每个值写在单独的列中,这就是我尝试 data[i][j] 的原因。
    • 好的,所以如果lg 是您可能想要在单个row 而不是data 上切片的列数。如果你能确认,我会更新代码。 csv 模块应该负责将您的行拆分为适当的列,但听起来您是在说它不适合您。我已经多次使用该模块,所以我认为代码中可能有一些你没有提供的东西,也许是编写器的初始化方式。
    • 我使用 with open('test.csv', 'wb') as f: and writer = csv.writer(f)
    • 对不起,如果这是一个愚蠢的问题或侮辱您的专业水平,但是您使用什么来打开您的 CSV 文件来验证其内容?您使用的是文本编辑器还是一些成熟的电子表格软件。我问只是因为某些电子表格软件可能对 CSV 有不同的默认方言(例如分号而不是逗号),因此无法正确解释它。
    • 只是为了好玩,将您的代码恢复到您希望工作的版本并在记事本/写字板等文本编辑器中打开文件,查看列是否用逗号正确分隔。我想知道您是否只需要在打开文件时设置一些选项(例如,Open Office Calc 有一个提示,可让您指定 CSV 文件的格式)。
    【解决方案2】:

    为什么不呢?

    for row in data:
        writer.writerow(row)
    

    【讨论】:

    • 之所以没有这样走是因为数据中的行看起来像这样:['blah', '11/12/2011', 6, 7, 8, 9]。因此,每个 csv 行都以该格式填充在一个单元格中。我为此提出的解决方法是指定列表中的每个项目。你知道在 row1 colA 中获得 blah 的更好方法吗?在 row1 colB 中获得 11/12/2011 等等?
    【解决方案3】:

    writerow() 将一行(字符串或数字的序列)作为输入。您的第二个代码仅将一个元素传递给 writerow(),因此该元素被写入单独的行(即 A 列中的每个元素)。在您的第一个示例中,您通过将整个数据行集合传递给 writerow() 来做正确的事情,这样它就可以工作了。正如 Dan D. 所建议的那样,一种更 Pythonic 的方式是

    for x in data:
        writer.writerow(x)
    

    【讨论】:

    • 谢谢。那讲得通。请参阅上面我对 Dan D. 的评论。
    • 我没有完全理解。根据您在 csv 中定义的分隔符,数据将写入一行,列表中的每个元素由分隔符分隔(默认为 ,)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 2016-09-30
    • 1970-01-01
    • 2018-12-23
    • 2018-03-14
    相关资源
    最近更新 更多