【问题标题】:How do I duplicate CSV rows row_number times?如何复制 CSV 行 row_number 次?
【发布时间】:2016-06-20 19:57:18
【问题描述】:

我正在尝试使用 Python 生成一个 CSV 文件“距离”,我想在其中复制另一个文件的行,“结果”如下:

结果.csv:

|ID |
|---|
| 1 |
| 2 |
| 3 |
...

距离.csv

|ID1 |ID2 |
|----|----|
| 1  | 1  |
| 1  | 2  |
| 1  | 3  |
| 2  | 1  |
| 2  | 2  |
| 2  | 3  |
...

这是我的 Python 代码:

with open('distances.csv', 'wb') as ff:
    writer = csv.writer(ff, delimiter=";", quoting=csv.QUOTE_ALL)

    with open('result.csv', 'rb') as f:
        reader = csv.reader(f, delimiter=";", quoting=csv.QUOTE_NONE)
        reader2 = csv.reader(f, delimiter=";", quoting=csv.QUOTE_NONE)

        for row in reader:
            for row2 in reader2:
                lst = []
                lst.append(row[0])
                lst.append(row[1])
                lst.append(row2[0])
                lst.append(row2[1])

                writer.writerow([unicode(s).encode("utf-8") for s in lst])

由于某种原因,它只复制了 result.csv 中的第一行

提前致谢!

【问题讨论】:

  • 我们应该从源文件中复制每一行多少次?我们如何获得列 ID2(或者它只是一个特定行被复制多少次的运行计数)。
  • 抱歉没有指定,列 ID2 只是复制行 ID 的结果,所以以第 1 行为例,我想复制所有 ID(包括 1,我将在稍后删除该案例) .所以假设我有 100 行,我想将每一行复制 100 次。
  • 有像 (1,1), (2,2) 等这样的距离有意义吗?它们总是等于零?
  • 所以如果我理解你的话,每一行都会被文件中的行数复制。 ID2 是每个重复行的运行计数。

标签: python loops csv


【解决方案1】:

您可以使用itertools.productdistance.csv 中的ID 列上进行重复:

from itertools import product
import csv


with open('result.csv', 'r') as fin, open('distance.csv', 'w') as fout:
    reader = csv.reader(fin, delimiter=";", quoting=csv.QUOTE_NONE)
    writer = csv.writer(fout, delimiter=";", quoting=csv.QUOTE_ALL)

    # skip header
    next(reader)

    buffer_ = [row[0] for row in reader]

    writer.writerow(['ID1', 'ID2'])
    writer.writerows(i for i in product(buffer_, repeat=2))

如果您需要2个以上的重复:'ID1', 'ID2',..., 'IDn',请将product中的重复值更改为n

【讨论】:

  • 非常好的答案,但您可以使用列表理解而不是您的第一个 forwriter.writerows(...) 而不是您的第二个 for 以提高效率
  • 这也有效!而且它只获取文件的ID列,更准确。谢谢!
  • @Brian 感谢您的关注
【解决方案2】:

由于csv.reader 是文件的迭代器,因此您只能遍历一次。尝试将行读入列表:

with open("result.csv", "b") as f, open("distances.csv", "wb") as ff:
    reader = csv.reader(f, delimiter=";", quoting=csv.QUOTE_NONE)
    writer = csv.writer(ff, delimiter=";", quoting=csv.QUOTE_ALL)
    rows = list(reader)

    for row1 in rows:
        for row2 in rows:
            lst = row1 + row2
            writer.writerow(lst)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-10
    • 2013-10-08
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 2018-08-19
    • 2020-01-04
    • 1970-01-01
    相关资源
    最近更新 更多