Hướng dẫn compare two large csv files for differences python - so sánh hai tệp csv lớn để tìm sự khác biệt python

5

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

Tôi đang cố gắng tính toán sự khác biệt giữa hai tệp CSV lớn (~ 4GB) để có được các hàng mới được thêm vào và ghi chúng vào tệp CSV đầu ra. Tôi có thể có được chức năng này cho các tệp tương đối nhỏ (~ 50MB) bằng cách sử dụng mã sau.

input_file1 = "data.csv" input_file2 = "data_1.csv" output_path = "out.csv" with open(input_file1, 'r') as t1, open(input_file2, 'r') as t2: fileone = t1.readlines() filetwo = t2.readlines() with open(output_path, 'w') as outFile: for line in filetwo: if line not in fileone: outFile.write(line)

Tuy nhiên, đối với các tệp lớn hơn, mã trên là quá chậm (chạy trong khoảng nửa giờ) hoặc gặp sự cố vì thiếu không gian bộ nhớ.

Có cách nào nhanh hơn để có được sự khác biệt cho các tệp CSV lớn không?

Hỏi ngày 30 tháng 4 năm 2018 lúc 19:43Apr 30, 2018 at 19:43

iprof0214iprof0214iprof0214

6612 Huy hiệu vàng6 Huy hiệu bạc19 Huy hiệu đồng2 gold badges6 silver badges19 bronze badges

5

Bạn không phải đọc hoàn toàn tệp thứ hai, chỉ cần đọc từng dòng.

Và với tốc độ, chỉ cần tạo một set trong tệp đầu tiên (tra cứu nhanh và lưu bộ nhớ nếu có các dòng trùng lặp). Đối với điều này, bạn phải mở tệp thứ hai khi bạn viết kết quả:

input_file1 = "data.csv" input_file2 = "data_1.csv" output_path = "out.csv" with open(input_file1, 'r') as t1: fileone = set(t1) with open(input_file2, 'r') as t2, open(output_path, 'w') as outFile: for line in t2: if line not in fileone: outFile.write(line)
  • for line in t2 đọc từng dòng tệp (luôn luôn tránh readlines() nếu bạn có thể) vì vậy ngay cả khi tệp lớn, dấu chân bộ nhớ nhỏ.
  • fileone có một số bộ nhớ, đúng, nhưng hy vọng nếu nó nhỏ hơn và/hoặc có các dòng trùng lặp, không quá nhiều, và tất nhiên là ít hơn với readlines()
  • if line not in fileone có thể trông giống như trước đây, nhưng nó có độ phức tạp trung bình ____10, giúp chương trình nhanh hơn nhiều

Đã trả lời ngày 30 tháng 4 năm 2018 lúc 19:49Apr 30, 2018 at 19:49

0

Bạn có thể sử dụng cơ sở dữ liệu hoặc thay vào đó là một sự hợp nhất sắp xếp. Tôi sẽ cung cấp cho bạn thuật toán cơ bản (chứ không phải mã Python)Sort Merge. I will give you the basic algorithm (rather than python Code)

Sắp xếp mô tả hợp nhất

Ý tưởng là sắp xếp 2 tệp theo thứ tự tương tự. Sau đó đọc tuần tự qua 2 tệp

  • Nếu các bản ghi trong 2 tệp bằng nhau -> trong cả hai tệp
  • Nếu bản ghi tệp cũ> hồ sơ mới-> bản ghi đã được chèninserted
  • if old-file-record < new-file-record --> record has been deleted

Sắp xếp thuật toán hợp nhất

Sort the 2 files to new SortedFiles using the Operating Systems sort (use the whole record as sort key) Open/Read SortedOldFile Open/Read SortedNewFile while (not end-of-file-SortedOldFile) and (not end-of-file-SortedOldFile): if SortedOldFile.record < SortedNewFile.record: ## Deleted processing goes here read SortedOldFile elseif SortedOldFile.record > SortedNewFile.record: ## Insert processing goes here read SortedNewFile else read SortedOldFile read SortedNewFile while (not end-of-file-SortedOldFile): ## Deleted processing read SortedOldFile while (not end-of-file-SortedNewFile): ## Insert processing read SortedNewFile

Advantages:

  • Sử dụng bộ nhớ tối thiểu
  • Nó chia tỷ lệ thành các tệp hoàn toàn lớn
  • Phải đủ nhanh, các loại hệ điều hành rất hiệu quả

Disadvantages:

  • Sử dụng không gian đĩa bổ sung (không gian đĩa ngày nay rẻ tiền)
  • Mã phụ thuộc vào hệ điều hành

Đã trả lời ngày 1 tháng 5 năm 2018 lúc 0:19May 1, 2018 at 0:19

Bruce Martinbruce MartinBruce Martin

10,3K1 Huy hiệu vàng26 Huy hiệu bạc37 Huy hiệu đồng1 gold badge26 silver badges37 bronze badges

Bạn có thể băm dòng để nén bộ nhỏ hơn, sau đó so sánh. hoặc sử dụng thuật toán nâng cao hơn để tìm dấu vân tay
or using more advanced algorithm to find finger print

//en.wikipedia.org/wiki/Fingerprint_(computing)

import hashlib input_file1 = "data.csv" input_file2 = "data_1.csv" output_path = "out.csv" def get_data(file_): res = {} m = hashlib.md5() for i, line in file_: hashed_line = m.update(line).hexdigest() if hashed_line not in res: res[hashed_line ] = [] res[hashed_line ].append(i) with open(input_file1, 'r') as t1, open(input_file2, 'r') as t2: file1_data = get_data(t1) file2_data = get_data(t2) file2_raw = t2.readlines() with open(output_path, 'w') as outFile: for line in file2_data: if line not in file1_data: outFile.write(file2_raw[file2_data[line]])

Đã trả lời ngày 30 tháng 4 năm 2018 lúc 19:53Apr 30, 2018 at 19:53

Galaxyangalaxyangalaxyan

5.7082 Huy hiệu vàng18 Huy hiệu bạc41 Huy hiệu đồng2 gold badges18 silver badges41 bronze badges

7

Làm cách nào để so sánh hai tệp CSV lớn?

Để khám phá, bạn có thể so sánh một loạt các CSV bên cạnh một dự án như thế này trên Acho. Vì đó là cơ sở dữ liệu quan hệ, bạn có thể so sánh các cột, giá trị và nhiều hơn giữa các bảng CSV một cách hợp lý ...
Sao chép a. CSV z. CSV ..
Loại b. CSV >> z. CSV ..
Loại c. CSV >> z. CSV ..

Làm cách nào để so sánh hai tệp CSV trong Python và trả về sự khác biệt?

csv-diff..
Cài đặt. PIP Cài đặt CSV-DIFF ..
Cách sử dụng. Hãy xem xét hai tệp CSV: ....
Là một thư viện Python. Bạn cũng có thể nhập thư viện Python vào mã của riêng bạn như vậy: từ CSV_DIFF nhập load_csv, so sánh diff = so sánh (load_csv (mở ("one.csv"), key = "id"), load_csv (mở ("hai.csv "), phím =" id ")).

Làm thế nào tôi có thể tìm thấy sự khác biệt giữa hai tệp CSV?

Cuối cùng, để so sánh hai tệp, hãy chạy fc fileName1.CSV Filename2 ...
Nhấn phím tắt Windows + R để mở dấu nhắc chạy Windows '..
Nhập CMD và nhấn Enter để mở cửa sổ CMD Terminal DOS ..
Thay đổi đường dẫn hiện tại bằng cách chạy lệnh cd c: \ path \ thành \ thư mục \ của bạn để tiếp cận vị trí của hai tệp CSV ..

Làm cách nào để đọc hai tệp CSV trong Python?

# Đọc các tệp CSV từ danh sách df = pd.Concat (bản đồ (pd. ...
# Nhập thư viện Nhập Glob Nhập gấu trúc dưới dạng PD # Nhận danh sách tệp CSV từ đường dẫn thư mục = '/apps/data_csv_files csv_files = glob.....
df = pd.....
# Bằng cách sử dụng hàm def readcsv (args): trả về pd.....
# Sử dụng thư viện dữ liệu Nhập DASK ..

Chủ đề