如果CSV行存在于随机样本中,则更新该行

时间:2018-05-04 11:18:43

标签: python

获得一个CSV,我使用以下代码选择500行的随机样本:

for (Map.Entry<String,String> entry : header.entrySet()) {                  
    conn.setRequestProperty(entry.getKey(), entry.getValue());
}

我想要做的是更新一个名为[winner]的列,如果它们存在于样本中,然后将其保存回csv文件,但我不知道如何实现这个...

名为[ID]的列中有唯一标识符。

我该怎么做?

2 个答案:

答案 0 :(得分:2)

从看起来像这样的CSV开始:

ID  something   winner
1   a   
2   b   
3   c   
4   a   
5   d   
6   a   
7   b   
8   e   
9   f   
10  g

您可以使用以下方法。读入整个文件,通过随机选择的索引选择行,并将其写回文件。

import csv
import random

# Read in the data
with open('example.csv', 'r') as infile:
    reader = csv.reader(infile)
    header = next(reader) # We want the headers, but not as part of the sample
    data = []
    for row in reader:
        data.append(row)

# Find the column called winner
winner_column_index = header.index('winner')

# Pick some random indices which will be used to generate the sample
all_indices = list(range(len(data)))

sampled_indices = random.sample(all_indices, 5)

# Add the winner column to those rows selected
for index in sampled_indices:
    data[index][winner_column_index] = 'Winner'

# Write the data back
with open('example_out.csv', 'w', newline='') as outfile:
    writer = csv.writer(outfile)
    writer.writerow(header) # Make sure we get the headers back in
    writer.writerows(data) # Write the rest of the data

这将提供以下输出:

ID  something   winner
1   a   
2   b           Winner
3   c   
4   a           Winner
5   d   
6   a           Winner
7   b   
8   e   
9   f           Winner
10  g           Winner

编辑:事实证明,如果要使用Excel打开,将CSV的第一列称为ID并不是一个好主意。然后它错误地认为该文件是SYLK格式。

答案 1 :(得分:0)

首先,你为什么使用csv而不是数据库?即使是一个sqlite也会容易得多(内置 - import sqlite3

其次,您需要再次编写整个文件。我建议你使用你的行作为列表并只更新它们(列表就像指针一样,你可以改变内部值,它会更新)

lines=[list(line) for line in source]

然后 for choice in random_choice: choice[WINNER_INDEX]+=1

并编写文件