我有一个逗号分隔的城市,州,邮编和州缩写的CSV文件。该文件中包含不同邮政编码的重复引用。我输出所需的只是列出的一个城市,只有一个邮政编码,而不是具有所有不同邮政编码的城市的同名。
以下是我在数据中的内容(csv文件中有26k行)
Phoenix, Arizona, 87654, AZ
Phoenix, Arizona, 87655, AZ
Tuscon, Arizona, 98754, AZ
Tuscon, Arizona, 98755, AZ
Tuscon, Arizona, 98756, AZ
我需要的是删除重复的城市行并保留一行。所以我的输出需要看起来像这样。
Phoenix, Arizona, 87654, AZ
Tuscon, Arizona, 98756, AZ
这是我目前的代码,但是没有用。
import os, sys, csv
f1 = csv.reader(open('originalcities.csv', 'rb'))
writer = csv.writer(open("output_cities.csv", "wb"))
city = set()
for row in f1:
if row[1] not in city:
write.writerow(row)
city.add( row[1] )
我不确定代码是否适合我获取我正在寻找的输出。当我运行此代码时,我收到此错误。
for row in f1:
_csv.Error: iterator should return strings, not bytes (did you open the file in
text mode?)
非常感谢任何帮助。谢谢。
答案 0 :(得分:1)
使用row[1]
表示每个州保留一个条目。
您应该在(row[0], row[1])
上进行测试(城市/州组合,以避免混淆,例如Richmond TX与Richmond VA)。
import csv
IN_FILE = 'originalcities.csv'
OUT_FILE = 'output_cities.csv'
def main():
with open(IN_FILE, 'rb') as inf, open(OUT_FILE, 'wb') as outf:
incsv, outcsv = csv.reader(inf), csv.writer(outf)
# read data and de-duplicate by city and state
citystates = set()
for row in incsv:
citystate = tuple(row[0:2])
if citystate not in citystates:
outcsv.writeline(row)
citystates.add(citystate)
if __name__=="__main__":
main()
**编辑:**
基于@Fernando的建议,这里是一个不需要集合的版本,它只是比较连续的行(这要求输入数据已经按排序顺序,或者至少是每个城市/州组合的所有出现次数)在一起)。
import csv
from itertools import groupby
IN_FILE = 'originalcities.csv'
OUT_FILE = 'output_cities.csv'
def main():
with open(IN_FILE, 'rb') as inf, open(OUT_FILE, 'wb') as outf:
incsv = csv.reader(inf)
outcsv = csv.writer(outf)
# Read data and de-duplicate by city and state
# ! assumes data is already in sorted order !
for citystate,rows in groupby(incsv, key=lambda row: row[0:2]):
outcsv.writerow(next(rows))
if __name__=="__main__":
main()
答案 1 :(得分:0)
如何使用set
删除重复项?
line_sets = []
full_set = []
with open('file.txt') as inp:
lines = inp.readlines()
for i in range(0, len(lines)):
# strip for precaution
tokens = [w.strip() for w in lines[i].split(',')[0:2]]
tmp_set = set(tokens)
if tmp_set not in line_sets:
full_set.append(lines[i].split(','))
line_sets.append(tmp_set)
with open('output.txt', 'w') as out:
for line in full_set:
out.write(','.join(line))
Phoenix,Arizona,87654,AZ
Tuscon,Arizona,98754,AZ