@zisho

Memory Error при определении кодировки как чинить?

Писал код который ищет значения заданные пользователем в csv файле но была проблема разных кодировок и я изменил скрипт теперь MemoryError как это починить

Код:
import os
import csv
import chardet

choose = input('тест:')

if choose == '1':
    number = input('Введи номер телефона (Например: 7XXXXXXXXXX):')
    print('Поиск займет от 5 до 10 минут...')
    
    os.chdir('bd')
    os.chdir('numbers')
    
    def search_in_csv(result, search_term):
        count = 0
        found_rows = []
        
        with open(result, 'rb') as csvfile:
            data = csvfile.read()
            encoding = chardet.detect(data)['encoding']
        
        with open(result, newline='', encoding=encoding) as csvfile:
            csvreader = csv.reader(csvfile, delimiter=';')
            for row in csvreader:
                found = False
                for value in row:
                    if search_term.lower() in value.lower():
                        found = True
                        break
                if found:
                    count += 1
                    found_rows.append(row)
        
        print(f"Количество совпадений: {count}")
        for row in found_rows:
            print(*row, sep='|')
    
    for name in 'GetContact_2021_59kk', 'part2':
        format_bd = 'csv'
        delimiters = '.'
        result = name + delimiters + format_bd
        search_term = number
        search_in_csv(result, search_term)
  • Вопрос задан
  • 76 просмотров
Пригласить эксперта
Ответы на вопрос 1
Maksim_64
@Maksim_64
Data Analyst
используй для чтения csv pandas, на случай если они там огромные, то с параметром chunksize=количество строк (по простому чтение по частям) и encoding=то что chardet вернул. Далее поставь колонку с номерами телефона в индекс (для пандас не уникальные индексы это совершенно нормально) и верни csv файл с совпадениями. Код будет что то вроде этого. Предположим это твой csv файл
Номер Телефона,Имя,Фамилия
333,Иван,Петров
333,Василий,Сидоров
444,Петр,Прямой
333,Федор,Кривой

import pandas as pd
phone_numbers = pd.read_csv('test.csv',index_col='Номер Телефона')
numbers_of_interset = [777,333]
index = phone_numbers.index.intersection(numbers_of_interset)
not_found = pd.Index(numbers_of_interset).difference(phone_numbers.index)
(
    phone_numbers.loc[index,:]
   .to_csv('result.csv')
)

Читаем в фрейм и устанавливаем номер телефона в индекс, numbers_of_interest это те номера которые ты хочешь вернуть в качестве выборки если они есть в файле, делаем intersection с индексом фрейма, также находим те что не нашлись. Записываем файл только с теми что есть. При необходимости выводим те что не нашлись хранятся в not_found.

Если они очень большие и требуют чтения по частям обратись к докам pandas ну или вот пример использования https://www.geeksforgeeks.org/how-to-load-a-massiv...

Ну и если тебе не нужна вся выборка а только количество совпадений мне это не очевидно из твоего вопроса, то в контексте моего примера
print(phone_numbers.loc[index,:].shape[0]) Даст тебе количество.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы