2015-11-12 76 views
0

我有两列的号码,我想对它们进行比较。 然后,输出文件将在第2列中较小,在第1列中较大。比较两列号和输出结果

例如,下面是我的XX.csv文件。

C1,C2

1015,945

1028,958

1901,1966

10016,9946

5292,5362

file = open ('input.csv','rb') 
fi = file.readlines() 
new_collect = [] 
final = [] 

for row in fi: 
    row_new = row.rstrip().split(',')  

    if row_new[1] > row_new[2]: 
     new_collect = row_new[2] + ',' + row_new[1] 
     final.append(new_collect) 

    elif row_new[2] > row_new[1]: 
     new_collect = row_new[2] + ',' + row_new[1] 
     final.append(new_collect) 

fo = open('output.csv', 'wb') 
fo.write('\n'.join(final)+'\n') 
fo.close() 

但我的结果是不正确的。结果不一致(第1栏>第2栏)。

任何人都可以帮忙吗?否则更好的方法呢?

谢谢!

回答

0

在你的代码的主要错误是,你是不是比较数字,但字符串,因此“2”比“10”大。

我有一些其他的话:

  • 忌用file变量名,因为它是一个保留的名称。
  • 你可以遍历一个“为”过一个文件对象的语句在一次理线线路
  • 当您访问的文本文件,你应该避免使用二进制模式
  • 使用“与”语句,以确保文件正确关闭

这是我提出的解决方案:

with open('input.csv', 'r') as ifile: 
    with open('output.csv', 'w') as ofile: 
     for line in ifile: 
      try: 
       c1, c2 = [int(val.strip()) for val in line.split(',', 1)] 
      except ValueError: 
       # skip malformed lines 
       continue 
      ofile.write("%s,%s\n" % (
       (c1, c2) if c1 > c2 else (c2, c1))) 
+0

感谢您的代码!:)) – Sakura

0

我相信你的问题是,数组中的值被视为字符串,而不是整数。我建议你将每个值转换为一个整数(或任何适当的数字格式),然后进行比较。

例如,1015可能会比945更大的数字,但1是按字母顺序小于9,所以1015将始终显示为较小的值,除非您对它们进行比较数字。

+0

感谢回复,您的建议是有帮助的。 – Sakura