Python:在for循环中写入CSV,在特定列中有条件地添加值

时间:2017-03-29 21:13:18

标签: python csv pandas

以下是我的CSV文件内容的示例:

Fruit, colour, ripe,

apple, green,,
banana, yellow,,
pineapple, green,,
plum, purple,,

我想循环遍历CSV文件的内容并根据测试(CSV数据的外在,使用提供给封闭函数的输入值),最终得到如下内容:

Fruit, colour, ripe,

apple, green, true, 
banana, yellow,, 
pineapple, green,, 
plum, purple, true,

我目前的代码如下:

csv_data = csv.reader(open('./data/fruit_data.csv', 'r'))
for row in csv_data:
    fruit = row[0]
    if fruit == input:
    # Here, write 'true' in the 'ripe' column.

使用CSV模块或pandas一次添加新数据非常简单,但在这里我需要迭代添加数据。我似乎无法在适当的位置更改CSV文件(?),但如果我写出不同的CSV文件,它将覆盖循环中的每个匹配,因此它只会反映该值。

4 个答案:

答案 0 :(得分:3)

基本上,你有两种方法:

1-在循环之前打开第二个文本文件,然后循环遍历初始文件的每一行,并将行追加到第二个文件。完成所有行后,关闭初始文件。示例:How do you append to a file?

2-从最初的csv中读取所有内容。然后更改您创建的对象(强烈建议您使用Pandas)。然后写出一个csv。以下是该方法的一个示例:

import pandas as pd
import numpy as np

# read in the csv
csv_data = pd.read_csv('./data/fruit_data.csv')

# I'm partial to the numpy where logic when creating a new column based 
# on if/then logic on an existing column
csv_data['ripe'] = np.where(csv_data['fruit']==input, True, False)

# write out the csv
csv_data.to_csv('./data/outfile.csv')

1和2之间的选择应该真正按比例缩小。如果你的csv太大了以至于无法按照你想要的方式阅读并操纵它,那么你应该逐行骚扰它。如果您可以阅读整个内容然后使用Pandas进行操作,那么您的生活将变得更加轻松。

答案 1 :(得分:1)

要进行更改,您必须将新数据添加到列表等位置。此列表将包含您处理的结果。

fruit_details= list()
csv_data = csv.reader(open('./data/fruit_data.csv', 'r'))
for row in csv_data:
    fruit = row[0]
    if fruit == input:
       fruit_details.append([row[0],row[1],'true'])

结果列表fruit_details将在“成熟”列中包含true的水果。如果你要附加非水果项,请添加和else语句,根据需要放置false或row [2]。

答案 2 :(得分:1)

如果您创建临时文件,则可以在阅读时编写行。如果您在Unix上使用os.rename," the renaming will be an atomic operation":

import csv
import os

def update_fruit_data(input):
    csv_file_name = 'data/fruit_data.csv'
    tmp_file_name = "%s.tmp" % csv_file_name
    # Update fruit data
    with open(csv_file_name, 'r') as csv_input_file:
        csv_reader = csv.reader(csv_input_file)
        with open(tmp_file_name, 'w') as csv_output_file:
            csv_writer = csv.writer(csv_output_file)
            for row in csv_reader:
                fruit = row[0]
                if fruit == input:
                    row[2] = 'true'
                csv_writer.writerow(row)
    # Rename tmp file to csv file
    os.rename(tmp_file_name, csv_file_name)

while True:
    input = get_input()
    update_fruit_data(input)

get_input这里是您用来获取input值的替代品。

答案 3 :(得分:1)

如果要创建新的CSV文件

csv_data = csv.reader(open('./Desktop/fruit_data.csv', 'r'))
csv_new = csv.writer(open('./Desktop/fruit_new_data.csv', 'w'))
for row in csv_data:
    fruit = row[0]
    if fruit == input:
        row.append("ripe")
        csv_new.writerow(row)
    else:
        csv_new.writerow(row)

基本上,上一个问题中唯一缺少的是最后一个法则,即写入,否则在标准不匹配时添加。

另一种可能性是使用linestartswith