Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python3更改CSV中的特定列_Csv_Python 3.x - Fatal编程技术网

使用python3更改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]是您的

举个例子。我有一个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]是您的第一个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”)
忘记这个动作,使用编辑过的代码,我只建议了原始答案,因为我认为你想修改原始文件。文件中实际有多少列