我是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)
我不明白这是怎么回事。
但我问自己另一个问题:如果增加的数字现在是重复的,我该如何检查?它不会创建一个无限循环?
答案 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