使用python在csv文件的两列中排列数据

时间:2012-07-07 15:37:06

标签: python csv

我有一个像下面那样的csv文件

1,1  
2,2  
3,4  
4,5  
6,6

如您所见,第1列缺少“5”,第2列缺少“3” 我想编写一个脚本,允许我比较两列并插入“值缺失”。输出看起来像:

1,1  
2,2
3, value missing
4,4
value missing, 5
6,6  

非常感谢任何帮助! 注意:我在示例中使用了数字,真正的问题是没有任何实际意义的字符串

编辑: 我在下面列出了实际数据的样本

HM999993,HM999993  
HM999995,HM999995  
HM999997,HM999997  
J04353,J04353  
JF800658,JF834523  
JF834523,JF906559  
JF906559,JN171845  
JN171845,K02718  
JN709469,M12732  
JN709470,M12737  
JN709471,M14119  
JN709472,M17463  
JQ754321,M20219  

3 个答案:

答案 0 :(得分:2)

使用整数这是一个相当简单的任务。但是,使用字符串会更复杂。使用整数,您可以比较两个数字,如果一个高于另一个,那么您就会知道存在缺失值。这种直接的比较不适用于字符串,除非按字母顺序排序,并且每个字母只有一个字符串。

如果您只是比较每个文件中的行数以确定缺失字符串的总数,那么您将遇到问题,根据您的问题中的要求确定缺少的字符串来自哪个位置。

答案 1 :(得分:1)

需要进一步简化,但我认为它有效:

#!/usr/bin/python
import csv

def navigation(iterable):
    iterator = iter(iterable)
    prev = None
    item = iterator.next()

    for next in iterator:
        yield (prev, item, next)
        prev = item
        item = next

    yield (prev, item, None)

with open('input.csv') as csv_input:
    with open('output.csv', 'w') as csv_output:
        old_data = []
        new_data = []

        for row in csv.reader(csv_input):
            old_data += row

        for index, (_prev, item, _next) in enumerate(navigation(old_data)):
            if _next != item:
                if _prev != item:
                    row = [item, 'missing value']
                    new_data.append(row if index % 2 == 0 else row[::-1])
            else:
                new_data.append([item, _next])

        writer = csv.writer(csv_output, delimiter=',', lineterminator='\n')
        writer.writerows(new_data)

答案 2 :(得分:0)

如果不知道每列中预期的完整字符串列表,我认为这不能解决。否则,

import csv

expected_in_A = set(['a','b','c','d'])
expected_in_B = set(['w','x','y','z'])

def main():
    with open('myfile.csv', 'rb+') as f:
        incsv = csv.reader(f)
        for row in incsv:
            expected_in_A.discard(row[0])
            expected_in_B.discard(row[1])

        # because the file opening mode included '+',
        # and because we have already read to the end of it,
        # we can now simply append to it:
        outcsv = csv.writer(f)
        outcsv.writerows([val, 'value missing'] for val in expected_in_A)
        outcsv.writerows(['value missing', val] for val in expected_in_B)

if __name__=="__main__":
    main()

如果myfile.csv包含

a,w
b,x
d,z

(在z!之后回车)然后它变成

a,w
b,x
d,z
c,value missing
value missing,y