2011-10-07 84 views
5

Tôi có tệp CSV có nhiều mục nhập. Ví dụ: csv:Python: Xóa các mục nhập CSV trùng lặp

user, phone, email 
joe, 123, [email protected] 
mary, 456, [email protected] 
ed, 123, [email protected] 

Tôi đang cố loại bỏ các từ khóa trùng lặp theo một cột cụ thể trong CSV tuy nhiên với mã bên dưới tôi nhận được "danh sách chỉ mục nằm ngoài phạm vi". Tôi nghĩ bằng cách so sánh row[1] với newrows[1] Tôi sẽ tìm tất cả các bản sao và chỉ ghi lại các mục nhập duy nhất trong file2.csv. Điều này không làm việc mặc dù và tôi không thể hiểu tại sao.

f1 = csv.reader(open('file1.csv', 'rb')) 
    newrows = [] 
    for row in f1: 
     if row[1] not in newrows[1]: 
      newrows.append(row) 
    writer = csv.writer(open("file2.csv", "wb")) 
    writer.writerows(newrows) 

kết quả cuối cùng của tôi là để có một danh sách duy trì chuỗi của tập tin (set sẽ không hoạt động ... phải không?) Mà nên xem xét như thế này:

user, phone, email 
joe, 123, [email protected] 
mary, 456, [email protected] 
+0

Tôi nghĩ rằng một cơ sở dữ liệu sẽ thực sự hữu ích ở đây. Python hoạt động OOB với SQLite, bạn biết không? – NullUserException

+0

khi một cái gì đó không hoạt động, bạn cần phải luôn luôn mô tả những gì đã xảy ra. Nó là một lỗi? là nó không có gì? nó có phải là điều sai trái? –

+0

Tôi đã làm ... mã của tôi hiện đang tạo chỉ mục danh sách ngoài phạm vi. Điều này không có ý nghĩa vì nó đang tìm kiếm cột thứ hai với hàng [1]. – serk

Trả lời

8

row[1] đề cập đến cột thứ hai trong hàng hiện tại (điện thoại). Đó là tất cả tốt trong tốt.

Tuy nhiên, bạn newrows.append(row) thêm toàn bộ hàng vào danh sách.

Khi bạn kiểm tra row[1] in newrows bạn đang kiểm tra số điện thoại riêng lẻ dựa trên danh sách các hàng hoàn chỉnh. Nhưng đó không phải là những gì bạn muốn làm. Bạn cần phải kiểm tra danh sách hoặc tập hợp các số điện thoại. Đối với điều đó, bạn có thể muốn theo dõi các hàng và một tập hợp các số điện thoại được quan sát.

Cái gì như:

f1 = csv.reader(open('file1.csv', 'rb')) 
writer = csv.writer(open("file2.csv", "wb")) 
phone_numbers = set() 
for row in f1: 
    if row[1] not in phone_numbers: 
     writer.writerow(row) 
     phone_numbers.add(row[1]) 
+0

Điều này đã hiệu quả. Cảm ơn! Tôi nghĩ rằng 'set' sẽ không hoạt động bởi vì nó sẽ không giữ trật tự của đầu ra chính xác. Điều này vẫn sẽ làm việc nếu tôi sử dụng danh sách 'newrows' và vừa sửa đổi' append (row) 'thành' writerow'? – serk

+0

@serk, đặt công việc vì tôi không bao giờ quan tâm đến đơn hàng. Tôi chỉ bao giờ kiểm tra xem có thứ gì trong đó không. Có, phụ thêm vào danh sách sẽ hoạt động tốt. –

+1

Bằng cách này nếu bạn đang vô tình loại bỏ số điện thoại trùng lặp để nói một cơ sở dữ liệu nhãn hiệu, bạn có khả năng thực sự lãng phí đi danh sách cuộc gọi của bạn theo cách đó. VÀ đôi khi các số điện thoại sau này trong tệp trình đọc của bạn sẽ ** mới hơn ** và số điện thoại chính xác hơn thì số điện thoại bạn đã gặp trước đó trong tệp trình đọc, vì chúng được ghi vào tệp nghe thời gian sau đó cùng một số điện thoại sau đó trong tệp trình đọc. – DevPlayer

Các vấn đề liên quan