CSV修改副本&算法" paradox",在python中

时间:2017-03-16 09:11:48

标签: python python-2.7 csv

我是python(2.7)的初学者。 所以这是我的文件:

data, 1234, data
data, 6868, data
data, 3545, data
data, 6868, data
data, 7777, data
data, 3545, data

我想检查副本(仅在第2列)并增加+1副本,如:

data, 1234, data
data, 6868, data
data, 3545, data
data, 6869, data
data, 7777, data
data, 3546, data

我做了类似的事情,但它只写了重复的行:

entries = set()
for row in reader:
    key = row[2] 
    if key in entries:
        aaa = row[2]
        bbb = int(aaa) + 1 
        ccc = str(bbb)
        entries.add(ccc)
    else:
        entries.add(key)
    writer.writerow(row)

我不明白这是怎么回事。

但我问自己另一个问题:如果增加的数字现在是重复的,我该如何检查?它不会创建一个无限循环?

2 个答案:

答案 0 :(得分:1)

在迭代文件时,将第2列的值存储在set中,当遇到重复值时,使用while递增1,直到该值变为唯一。存储新值,并使用csv.writer

将整行写入文件
import csv

data = set()
with open ('task1.txt', 'rb') as file_in, open ('output.txt', 'wb') as fileout:
    reader = csv.reader(file_in)
    writer = csv.writer(fileout)
    for line in reader:
        idx = int(line[1])
        while idx in data:
            idx += 1
        data.add(idx)
        line[1] = str(idx)

        writer.writerow(line)

注意:在Python2.7中,我们打开文件句柄buffer模式(即rb而不是r,但这在Python3中是不必要的。

答案 1 :(得分:1)

除非您拥有无限数据,否则它不会创建无限循环。 :)您的代码已关闭 - 您可以使用while with an else clause代替if ... else来处理与现有数字冲突的增加数字。您还需要使用新密钥更新row

这是一个从字符串中读取数据的版本,以便于测试。

import csv

table = '''\
data, 6870, data
data, 6869, data
data, 1234, data
data, 6868, data
data, 3545, data
data, 6868, data
data, 7777, data
data, 3545, data
'''

reader = csv.reader(table.splitlines(), skipinitialspace=True)
entries = set()
for row in reader:
    print(' IN', row)
    while row[1] in entries:
        row[1] = str(int(row[1]) + 1) 
    else:
        entries.add(row[1])
    print('OUT', row, end='\n\n')

<强>输出

 IN ['data', '6870', 'data']
OUT ['data', '6870', 'data']

 IN ['data', '6869', 'data']
OUT ['data', '6869', 'data']

 IN ['data', '1234', 'data']
OUT ['data', '1234', 'data']

 IN ['data', '6868', 'data']
OUT ['data', '6868', 'data']

 IN ['data', '3545', 'data']
OUT ['data', '3545', 'data']

 IN ['data', '6868', 'data']
OUT ['data', '6871', 'data']

 IN ['data', '7777', 'data']
OUT ['data', '7777', 'data']

 IN ['data', '3545', 'data']
OUT ['data', '3546', 'data']

要在Python 2上运行此代码,请在脚本开头添加:

from __future__ import print_function