将特定值写回.csv,Python

时间:2016-09-10 07:18:09

标签: python csv dictionary

我有一个。DATEDIFF文件,其中包含一些我想要更改的数据。 它看起来像这样:

csv

我的代码运行了我需要的大部分内容,但我不确定如何在我的item_name,item_cost,item_priority,item_required,item_completed item 1,11.21,2,r item 2,411.21,3,r item 3,40.0,1,r,c 上回写以产生此结果

.csv

我的代码:

item_name,item_cost,item_priority,item_required,item_completed
item 1,11.21,2,x
item 2,411.21,3,r
item 3,40.0,1,r,c

3 个答案:

答案 0 :(得分:1)

这里有几个问题

  • 你正在使用DictReader,这对于读取数据是好的,但是与原始文件一样不能读取和写入数据,因为字典不能确保列顺序(除非你不关心,但大多数时候人们不希望交换列。我只是阅读标题,找到列标题的索引,并在其余代码中使用此索引(没有dicts =更快)
  • 当你写作时,你附加到csv。您必须删除旧内容,而不是追加。并使用newline=''或者你得到很多空行(python 3)或"wb"(python 2)
  • 当您阅读时,您需要存储所有值,而不仅仅是您想要更改的值,或者您将无法回写所有数据(因为您要替换原始文件)
  • 当你修改时,你做了过度复杂的东西,我刚刚用给定索引处的一个简单的替换列表替换(毕竟你想在给定的行中将r更改为x

这是将所有上述评论考虑在内的固定代码

编辑:添加了您要求的功能:c之后添加x(如果尚未添加),在需要时扩展该行

import csv

line_count = 0
marked_item = int(input())
with open("items.csv", 'r') as f:
    reader = csv.reader(f, delimiter=',')
    title = next(reader)  # title
    idx = title.index("item_required")  # index of the column we target

    lines=[]
    for line in reader:
        if line[idx] == 'r':
            line_count += 1
            if marked_item == line_count:
                line[idx] = 'x'
                # add 'c' after x (or replace if column exists)
                if len(line)>idx+1:  # check len
                   line[idx+1] = 'c'
                else:
                   line.append('c')
        lines.append(line)

with open("items.csv", 'w',newline='') as f:
    writer = csv.writer(f,delimiter=',')
    writer.writerow(title)
    writer.writerows(lines)

答案 1 :(得分:1)

使用pandas

import pandas as pd

df = pd.read_csv("items.csv")

print("Enter the item number:")
marked_item = int(input())

df.set_value(marked_item - 1, 'item_required', 'x')

# This is the extra feature you required:
df.set_value(marked_item - 1, 'item_completed', 'c')

df.to_csv("items.csv", index = False)

marks_item = 1时的结果:

item_name,item_cost,item_priority,item_required,item_completed
item 1,11.21,2,x,c
item 2,411.21,3,r,
item 3,40.0,1,r,c

请注意,根据RFC4180,您应该保留尾随逗号。

答案 2 :(得分:0)

我想这应该可以解决问题:

  1. 打开一个可以读写的文件来更新它(使用“+ r”)
  2. 而不是再次打开它,使用我们在开始时创建的csvfilewriter将其写在那里。
  3. file.py

    import csv
    fieldnames = ["item_name","item_cost","item_priority","item_required","item_completed"]
    
    csvfile = open("items.csv", 'r+')
    csvfilewriter = csv.DictWriter(csvfile, fieldnames=fieldnames,dialect='excel', delimiter=',')
    csvfilewriter.writeheader()
    
    print("Enter the item number:") 
    line_count = 0
    marked_item = int(input())
    with open("items.csv", 'r') as f:
        reader = csv.DictReader(f, delimiter=',')
        for line in reader:
            if line["item_required"] == 'r':
                line_count += 1
                if marked_item == line_count:
                    new_list = line
                    print(new_list)
                    for key, value in new_list.items():
                        if value == "r":
                            new_list['item_required'] = "x"
                            print(new_list)
                            csvfilewriter.writerow(new_list)
    

    如果你不想更新csv但想要写一个新的,下面是代码:

    import csv
    
    fieldnames = ["item_name","item_cost","item_priority","item_required","item_completed"]
    
    csvfile = open("items_new.csv", 'w')
    csvfilewriter = csv.DictWriter(csvfile, fieldnames=fieldnames,dialect='excel', delimiter=',')
    csvfilewriter.writeheader()
    
    print("Enter the item number:")
    line_count = 0
    marked_item = int(input())
    with open("items.csv", 'r') as f:
        reader = csv.DictReader(f, delimiter=',')
        for line in reader:
            if line["item_required"] == 'r':
                line_count += 1
                if marked_item == line_count:
                    new_list = line
                    print(new_list)
                    for key, value in new_list.items():
                        if value == "r":
                            new_list['item_required'] = "x"
                            print(new_list)
                            csvfilewriter.writerow(new_list)
    
                else:
                    csvfilewriter.writerow(line)