我是python的新手,我的老师告诉我创建一个代码,可以根据每个字段中的值编辑csv文件。 这是一个嵌套列表,用于显示csv文件,该文件按行分成列表,然后按元素分割:
[["A","B","C","D"],["Yes",1,"05/11/2016","0"],["No","12","05/06/2017","1"],["Yes","6","08/09/2017","2"]]
我应该做的是创建一个循环,可以用来检测内部列表中元素的位置,然后将每个列表的第一个元素更改为“否”,如果是,则今天的第3个元素到今天的日期,如果陈述的日期至少是6个月,如果大于1,则最后一个元素为1,我该怎么做呢?
以下是我的代码:
filename="Assignment_Data1.csv"
file=open(filepath+filename,"r")
reader=csv.reader(file,delimiter=",")
from datetime import datetime
six_months = str(datetime.date.today() - datetime.timedelta(6*365/12-1))
fm_six_months=str(datetime.datetime.strptime(six_months, '%Y-%m-%d').strftime('%d/%m/%Y'))
td=datetime.now()
deDate = str(td)[8:10] + "/"+ str(td)[5:7] + "/"+ str(td)[0:4]
import csv
for row in reader:
for field in row:
if row[2]<=fm_six_months or row[4]>50 or row[2]<10:
row[3]=deDate
row[4]=0
row[2]=100
基本上我要做的是用想要通过循环来替换具有上述条件的字段,是否可能?
答案 0 :(得分:1)
您已走上正轨,但您的代码有几个问题:
1)导入语句。
csv.reader
,但尚未导入csv
。datetime
模块的方式与大多数代码不一致。这有点令人困惑,因为the datetime
module also has a datetime
class。根据您的要求,最简单的方法是将import语句更改为import datetime
,将第8行更改为td=datetime.datetime.now()
(now
是日期时间类的函数)。 2)迭代field
和 row
是多余的。您拥有的构造for row in reader: for field in row
将运行您的{ {1}}声明其他不必要的时间。
3) Python为零索引。这意味着第一个元素是使用if
访问的列表,而不是row[0]
。在您的情况下,您的CSV的第四列将通过row[1]
访问。
4)你正在组合条件。从作业的措辞来看,它听起来像每个条件(比如&#34;如果是,则将第一个元素更改为否是的&#34;)应该独立于另一个。但是,row[3]
表示如果任何条件为真,您将更改数据。听起来你需要三个独立的if row[2]<=fm_six_months or row[4]>50 or row[2]<10
块。
5)你的代码没有作家。这真的很重要。简单地说if
没有做任何持久的事情,因为row[2] = 100
只是记忆中的一个对象;更改row
实际上并未更改计算机上的CSV文件。要实际修改csv,您需要使用csv.writer
将其写回文件。