Python - 如何根据单元格从CSV中删除重复的单元格/行

时间:2014-02-04 03:17:05

标签: python csv duplicates

我有一个逗号分隔的城市,州,邮编和州缩写的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?)

非常感谢任何帮助。谢谢。

2 个答案:

答案 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))

output.txt的

Phoenix,Arizona,87654,AZ
Tuscon,Arizona,98754,AZ