Недавно мне пришлось импортировать CSV-файлы во внешнее приложение на работе, но приложение не смогло обрабатывать все строки, потому что это вызвало Тайм-ауты через несколько минут. Файлы не были точно огромными, они были только 8 МБ и максимали на 200 000 строк, но это было Слишком много Для этого приложения … 😢
Я не контролировал внешнее программное обеспечение, но мне нужно меньшие файлы . Я мог бы адаптировать приложение, которое создает их, но потребовало бы, чтобы получить данные из нескольких API снова, и это заняло много времени. ⌛
Вместо этого я решил попробовать разделение файлов напрямую. После быстрого поиска на поисковой системе я наткнулся на Гист в Python Это делает именно то, что я хотел. Мой файл CSV имел запятые ( ;
) вместо запятых ( ,
), поэтому я должен был Адаптировать свой скрипт немного Чтобы вместить это ( разделитель = ';'
).
Вот мой Адаптированная версия , Также сохранены в раздвоенном велосипеде, в случае, если мне нужно это позже:
import csv import sys import os # example usage: python split.py example.csv 200 # above command would split the `example.csv` into smaller CSV files of 200 rows each (with header included) # if example.csv has 401 rows for instance, this creates 3 files in same directory: # - `example_1.csv` (row 1 - 200) # - `example_2.csv` (row 201 - 400) # - `example_3.csv` (row 401) CURRENT_DIR = os.path.dirname(os.path.realpath( __file__ )) filename = sys.argv[1] full_file_path = os.path.join(CURRENT_DIR, filename) file_name = os.path.splitext(full_file_path)[0] rows_per_csv = int(sys.argv[2]) if len(sys.argv) > 2 else 5000 with open(filename) as infile: reader = csv.DictReader(infile, delimiter=';') header = reader.fieldnames rows = [row for row in reader] pages = [] row_count = len(rows) start_index = 0 # here, we slice the total rows into pages, each page having [row_per_csv] rows while start_index < row_count: pages.append(rows[start_index: start_index+rows_per_csv]) start_index += rows_per_csv for i, page in enumerate(pages): with open('{}_{}.csv'.format(file_name, i+1), 'w+') as outfile: writer = csv.DictWriter(outfile, fieldnames=header, delimiter=';') writer.writeheader() for row in page: writer.writerow(row) print('DONE splitting {} into {} files'.format(filename, len(pages)))
Благодаря Кельвин Тей Для его сценария это спасло меня много времени! 🥳.
Оригинал: “https://dev.to/ranb2002/how-to-split-a-large-csv-file-based-on-the-number-of-rows-312o”