使用python3更改CSV中的特定列
举个例子。我有一个CSV文件,如下所示:使用python3更改CSV中的特定列,csv,python-3.x,Csv,Python 3.x,举个例子。我有一个CSV文件,如下所示: 10,20,30,-40,50 20,30,40,-50,60 30,40,50,-60,70 基本上我需要翻转列中数字的符号。任何一列。在这个例子中,第四和第五的符号 10,20,30,40,-50 20,30,40,50,-60 30,40,50,60,-70 并将它们打印到新文件中 我可以读取CSV文件,但老实说,我不知道从那里去哪里。任何帮助都将不胜感激。逐行读取文件,并用CSV分隔符分隔。结果列表的顺序将按列的顺序排列(即拆分行[0]是您的
10,20,30,-40,50
20,30,40,-50,60
30,40,50,-60,70
基本上我需要翻转列中数字的符号。任何一列。在这个例子中,第四和第五的符号
10,20,30,40,-50
20,30,40,50,-60
30,40,50,60,-70
并将它们打印到新文件中
我可以读取CSV文件,但老实说,我不知道从那里去哪里。任何帮助都将不胜感激。逐行读取文件,并用CSV分隔符分隔。结果列表的顺序将按列的顺序排列(即拆分行[0]是您的第一个csv列,等等)。然后可以将该行写入新文件,并相应地修改数据。在您的情况下,我相信您希望最后两个值乘以负1。逐行读取文件,并用CSV分隔符分割。结果列表的顺序将按列的顺序排列(即拆分行[0]是您的第一个csv列,等等)。然后可以将该行写入新文件,并相应地修改数据。在您的情况下,我相信您希望最后两个值乘以负1。使用
csv
库解析您的文件:
import csv
with open("in.csv") as f, open("new.csv","w") as tmp:
r = csv.reader(f)
wr = csv.writer(tmp)
# wr.writerow(next(r)) # uncomment if file has header
# (*_ -> all but last two), (a, b -> second last and last value)
# -- == +, -+ == -
wr.writerows(_ + [-int(a), -int(b)] for *_, a, b in r:)
输入:
10,20,30,-40,50
20,30,40,-50,60
30,40,50,-60,70
输出:
10,20,30,40,-50
20,30,40,50,-60
30,40,50,60,-70
如果需要第n列,只需更改解包方式:
wr.writerows([a, b, c , -int(d), -int(e)] + _ for a, b, c, d, e,*_ in r:)
^^ ^^
4th 5th
wr.writerows([-int(a),b, -int(c), d, e] + _ for a, b, c, d, e,*_ in r:)
^^ ^^
1st 3rd
如果您有41列并希望更改,33,39,40,41:
with open("in.csv") as f, open("out.csv","w") as tmp:
r = csv.reader(f)
wr = csv.writer(tmp)
for *_, t_3, a, b, c, d, e, t_9, ft_0, ft_1 in r:
wr.writerow(_ + [-int(t_3), a, b, c, d, e, -int(t_9), -int(ft_0), -int(ft_1)])
使用
csv
lib解析文件:
import csv
with open("in.csv") as f, open("new.csv","w") as tmp:
r = csv.reader(f)
wr = csv.writer(tmp)
# wr.writerow(next(r)) # uncomment if file has header
# (*_ -> all but last two), (a, b -> second last and last value)
# -- == +, -+ == -
wr.writerows(_ + [-int(a), -int(b)] for *_, a, b in r:)
输入:
10,20,30,-40,50
20,30,40,-50,60
30,40,50,-60,70
输出:
10,20,30,40,-50
20,30,40,50,-60
30,40,50,60,-70
如果需要第n列,只需更改解包方式:
wr.writerows([a, b, c , -int(d), -int(e)] + _ for a, b, c, d, e,*_ in r:)
^^ ^^
4th 5th
wr.writerows([-int(a),b, -int(c), d, e] + _ for a, b, c, d, e,*_ in r:)
^^ ^^
1st 3rd
如果您有41列并希望更改,33,39,40,41:
with open("in.csv") as f, open("out.csv","w") as tmp:
r = csv.reader(f)
wr = csv.writer(tmp)
for *_, t_3, a, b, c, d, e, t_9, ft_0, ft_1 in r:
wr.writerow(_ + [-int(t_3), a, b, c, d, e, -int(t_9), -int(ft_0), -int(ft_1)])
在您的示例中,最后两列为负数。是否要替换?在您的示例中,最后两列为负数。你想交换吗?这就是我一直想得到的。一直困扰我的是,我需要能够定义它是什么列(实际的csv要长得多,并且包含私人信息,这就是我没有发布它的原因)。你的问题是,如何定义它是什么列,最后两列是你的问题。如果你的问题比你目前拥有的内容更复杂,请用更现实的示例输入编辑你的问题,除非你说你不知道它是哪一列,否则此代码将work@user2036101,我在你的编辑中没有看到任何会使此代码失败的内容。不,你是对的。我一时糊涂,写得不好。但是现在它在每列之间插入空行。我唯一修改的部分是:
writerow(next(r))for*.\uu,a,b,c,d,e,f,g,h,i在r:writerow(u+[-float(a),-float(b),c,d,e,f,g,h,-float(i)]move(tmp.name,“out.csv”)
忘记这个动作,使用编辑过的代码,我只建议了原始答案,因为我认为你想修改原始文件。文件中实际有多少列这就是我一直试图得到它的方式。一直困扰我的是,我需要能够定义它是什么列(实际的csv要长得多,并且包含私人信息,这就是我没有发布它的原因)。你的问题是,如何定义它是什么列,最后两列是你的问题。如果你的问题比你目前拥有的内容更复杂,请用更现实的示例输入编辑你的问题,除非你说你不知道它是哪一列,否则此代码将work@user2036101,我在你的编辑中没有看到任何会使此代码失败的内容。不,你是对的。我一时糊涂,写得不好。但是现在它在每列之间插入空行。我唯一修改的部分是:writerow(next(r))for*.\uu,a,b,c,d,e,f,g,h,i在r:writerow(u+[-float(a),-float(b),c,d,e,f,g,h,-float(i)]move(tmp.name,“out.csv”)
忘记这个动作,使用编辑过的代码,我只建议了原始答案,因为我认为你想修改原始文件。文件中实际有多少列