Nano Hash - криптовалюты, майнинг, программирование

Замените значение из CSV на Python

Мне нужно заменить значения в большом файле CSV, и я выбрал Python в качестве языка программирования, который я хочу использовать.

Значение, которое мне нужно изменить, является первым в каждой строке моего CSV, разделенного запятыми:

ToReplace, a1, a2, ..., aN
1, ab, cd, ..., xy
80, ka, kl, ..., df

Это всегда число, хотя количество цифр не является фиксированным.

На данный момент у меня есть две идеи: обрабатывать данные построчно и...

  1. Используйте регулярное выражение для сопоставления числа
  2. Используйте компонент CSV для анализа строки

Поскольку я новичок в Python, у меня возникло несколько вопросов:

  • Учитывая размер файла (> 50 ГБ; ~ 10 миллионов строк), какой метод быстрее?
  • Как это реализовать, не тратя много ресурсов?
03.03.2014

  • Кроме того: 50 ГБ — это слишком большой файл, чтобы хранить его в плоском формате, таком как CSV. Либо переключитесь на базу данных, либо, по крайней мере, разделите файлы на что-то более управляемое (например, 500 файлов по 100 МБ). 03.03.2014
  • Именно поэтому мне нужно обработать файл, чтобы я мог быстро и чисто поместить его в БД. 04.03.2014

Ответы:


1

Если вы хотите заменить первый столбец, который всегда содержит число, вы можете использовать строковый метод вместо более общего модуля csv, чтобы избежать синтаксического анализа всей строки:

#!/usr/bin/env python

def main():
    with open('50gb_file', 'rb') as file, open('output', 'wb') as output_file:
        for line in file:
            number, sep, rest = line.partition(b',')
            try:
                number = int(number)*2 #XXX replace number here
            except ValueError:
                pass # don't replace the number
            else:
                line = bytes(number) + sep + rest
            output_file.write(line)

main()
03.03.2014

2

Вы можете передать второй аргумент методу Python split, чтобы получить только первое совпадение, заменить его тем, что вы хотите, а затем снова соединиться в одну строку, например:

import logging

with open('example.csv', 'rb') as infile, \
        open('result.csv', 'wb') as outfile:
    for line in in file:
        try:
            number, rest = line.split(',', 1)
            number = 'blob'
            outfile.write(','.join([number, rest]))
        except ValueError:
            logging.error('The following line had no separator: %s', line)

Для 10 млн строк, на 2-х ядрах по 2,4 ГГц и 8 Гб ОЗУ я получаю следующие времена:

$ time python example.py

real    0m20.771s
user    0m20.336s
sys 0m0.369s
03.03.2014
  • number, rest = line.split(',', 1) терпит неудачу, если в строке нет запятой. Используйте совместимые файловые режимы для обоих файлов (либо оба двоичных, либо оба текстовых). 04.03.2014
  • @ J.F.Sebastian: вы правы, я отредактировал свой ответ, чтобы улучшить оба аспекта. Тем не менее, я предпочел зарегистрировать ошибку, потому что ошибки никогда не должны проходить молча. ;) 04.03.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..