以下是我的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文件,它将覆盖循环中的每个匹配,因此它只会反映该值。
答案 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