У меня есть файл csv около 7 мб, когда я пытаюсь прочитать файл, его отображающая ошибка газа [дубликат]

Для тех, кто находит это в будущем, я бы не рекомендовал использовать mail. Есть несколько ответов, которые касаются этого, но не из-за этого.

Функция PHP mail не только непрозрачна, но и полностью зависит от того, какой MTA вы используете (то есть Sendmail) для выполнения этой работы. mail будет ТОЛЬКО сообщать вам, не удалось ли MTA принять его (т. е. Sendmail был отключен, когда вы пытались отправить). Он не может сказать вам, была ли почта успешной, потому что она была передана. Как таковой (как детали ответов Джона Конде), вы теперь можете возиться с журналами MTA и надеяться, что он расскажет вам об отсутствии возможности исправить его. Если вы находитесь на общем хосте или не имеете доступа к журналам MTA, вам не повезло. К сожалению, по умолчанию для большинства ванильных инсталляций для Linux обрабатывается так.

Почтовая библиотека ( PHPMailer , Zend Framework 2+ и т. д.) делает что-то очень отличное от mail. То, что они делают, это открыть сокет непосредственно на принимающем почтовом сервере, а затем отправить SMTP-почтовые команды непосредственно через этот сокет. Другими словами, класс действует как собственный MTA (обратите внимание, что вы можете сказать библиотекам использовать mail, чтобы в конечном итоге отправить почту, но я настоятельно рекомендую вам не делать этого).

Что это означает, что вы можете непосредственно видеть ответы с принимающего сервера (например, в PHPMailer вы можете включить вывод отладки ). Больше не гадать, если почта не была отправлена ​​или почему.

Если вы используете SMTP (то есть вы вызываете isSMTP()), вы можете получить подробную расшифровку протокола SMTP, используя свойство SMTPDebug.

Установите этот параметр, включив в свой скрипт такую ​​строку:

$mail->SMTPDebug = 2;

Вы также получаете преимущество лучшего интерфейса. С помощью mail вы должны настроить все свои заголовки, вложения и т. Д. С библиотекой у вас есть специальная функция для этого. Это также означает, что функция выполняет все сложные элементы (например, заголовки).

146
задан firelynx 15 April 2016 в 06:38
поделиться

5 ответов

df = pd.read_csv('somefile.csv', low_memory=False)

Это должно решить проблему. Я получил точно такую ​​же ошибку при чтении строк 1.8M из CSV.

208
ответ дан firelynx 21 August 2018 в 14:26
поделиться
  • 1
    Это заставляет замолчать ошибку, но на самом деле ничего не меняет. – firelynx 13 January 2016 в 09:32
  • 2
    Итак, учитывая, что установка dtype=object не является более эффективной с точки зрения памяти, есть ли какая-то причина для того, чтобы с ней справиться, кроме того, чтобы избавиться от ошибки? – zthomas.nc 31 August 2016 в 07:09
  • 3
    @ zthomas.nc да, Pandas не нужно беспокоиться о том, что находится в столбце. Теоретически сохраняя некоторую память при загрузке (но ни один после завершения загрузки) и теоретически сохраняя некоторые циклы процессора (которые вы не заметите, поскольку дисковый ввод-вывод станет узким местом. – firelynx 1 September 2016 в 11:22
  • 4
    «Также стоит отметить, что если последняя строка в файле имела бы« foobar », записанный в столбце user_id, при загрузке произойдет сбой, если указан указанный выше тип dtype. & quot; существует ли какая-либо «принуждение», вариант, который можно использовать для выброса этой строки вместо сбоя? – sparrow 1 September 2016 в 15:33
  • 5
    @sparrow может быть, но в прошлый раз, когда я использовал его, у него были ошибки. Он может быть исправлен в последней версии панд. error_bad_lines=False, warn_bad_lines=True должен сделать трюк. В документации говорится, что он действителен только для синтаксического анализатора. Он также говорит, что синтаксический анализатор по умолчанию - «Нет», что затрудняет определение того, какой из них является значением по умолчанию. – firelynx 2 September 2016 в 06:48
  • 6
    @nealmcb Вы можете прочитать dataframe с nrows=100 в качестве аргумента, а затем сделать df.dtypes, чтобы увидеть dtypes, который вы получаете. Однако, читая весь файл данных с этими типами данных, обязательно сделайте try/except, чтобы вы уловили ошибочные догадки dtype. Данные грязные, вы знаете. – firelynx 19 December 2016 в 09:17
  • 7
    У меня такая же проблема при запуске файла данных 1.5gb – Sitz Blogz 25 May 2017 в 09:14

Устаревшая опция low_memory

Параметр low_memory устарел неправильно, но он должен быть, поскольку он фактически не делает ничего по-другому [ source ]

Причина, по которой вы получаете это предупреждение low_memory, состоит в том, что угадывание dtypes для каждого столбца очень требует памяти. Pandas пытается определить, какой dtype задавать, анализируя данные в каждом столбце.

Dtype Guessing (очень плохо)

Pandas может определять только то, что должен иметь столбец dtype после всего файла читается. Это означает, что ничего не может быть проанализировано до того, как весь файл будет прочитан, если вы не рискуете изменить dtype этого столбца при чтении последнего значения.

Рассмотрим пример одного файла с столбцом user_id , Он содержит 10 миллионов строк, где user_id всегда является числом. Поскольку панды не могут знать, что это только цифры, это, вероятно, сохранит их как исходные строки, пока не прочитает весь файл.

Задание типов dtypes (всегда должно быть сделано)

/ g15]

dtype={'user_id': int}

к вызову pd.read_csv() заставит pandas знать, когда он начнет считывать файл, что это только целые числа.

Также стоит отметить что если бы последняя строка в файле имела бы "foobar", записанную в столбце user_id, загрузка была бы сбой, если указан указанный выше тип dtype.

Пример разбитых данных, которые ломаются, когда определены типы dtypes

import pandas as pd
from StringIO import StringIO


csvdata = """user_id,username
1,Alice
3,Bob
foobar,Caesar"""
sio = StringIO(csvdata)
pd.read_csv(sio, dtype={"user_id": int, "username": object})

ValueError: invalid literal for long() with base 10: 'foobar'

dtypes, как правило, многозначительные вещи, подробнее о них здесь: http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html

Какие существуют типы dtypes?

Это numpy dtypes, которые также принимаются в pandas

[numpy.generic,
 [[numpy.number,
   [[numpy.integer,
     [[numpy.signedinteger,
       [numpy.int8,
        numpy.int16,
        numpy.int32,
        numpy.int64,
        numpy.int64,
        numpy.timedelta64]],
      [numpy.unsignedinteger,
       [numpy.uint8,
        numpy.uint16,
        numpy.uint32,
        numpy.uint64,
        numpy.uint64]]]],
    [numpy.inexact,
     [[numpy.floating,
       [numpy.float16, numpy.float32, numpy.float64, numpy.float128]],
      [numpy.complexfloating,
       [numpy.complex64, numpy.complex128, numpy.complex256]]]]]],
  [numpy.flexible,
   [[numpy.character, [numpy.bytes_, numpy.str_]],
    [numpy.void, [numpy.record]]]],
  numpy.bool_,
  numpy.datetime64,
  numpy.object_]]

Pandas также добавляет два типа dtypes: categorical и datetime64[ns, tz], которые недоступны в numpy

Ссылка на pandas dtype

Gotchas, оговорки, примечания

Settin g dtype=object отключит вышеуказанное предупреждение, но не сделает его более эффективным с точки зрения памяти, только эффективно.

Настройка dtype=unicode ничего не сделает, поскольку до numpy, unicode представленный как object.

Использование преобразователей

@sparrow правильно указывает на использование преобразователей, чтобы избежать взрыва панд при столкновении 'foobar' в столбце, указанном как int , Я хотел бы добавить, что преобразователи действительно тяжелы и неэффективны для использования в пандах и должны использоваться в качестве последнего средства. Это связано с тем, что процесс read_csv представляет собой один процесс.

Файлы CSV могут обрабатываться по строкам и, следовательно, могут быть обработаны несколькими преобразователями параллельно более эффективно, просто разбивая файл на сегменты и запуская несколько процессов, то, что панды не поддерживают. Но это совсем другая история.

208
ответ дан firelynx 21 August 2018 в 14:26
поделиться
  • 1
    Итак, учитывая, что установка dtype=object не является более эффективной с точки зрения памяти, есть ли какая-то причина для того, чтобы с ней справиться, кроме того, чтобы избавиться от ошибки? – zthomas.nc 31 August 2016 в 07:09
  • 2
    @ zthomas.nc да, Pandas не нужно беспокоиться о том, что находится в столбце. Теоретически сохраняя некоторую память при загрузке (но ни один после завершения загрузки) и теоретически сохраняя некоторые циклы процессора (которые вы не заметите, поскольку дисковый ввод-вывод станет узким местом. – firelynx 1 September 2016 в 11:22
  • 3
    «Также стоит отметить, что если последняя строка в файле имела бы« foobar », записанный в столбце user_id, при загрузке произойдет сбой, если указан указанный выше тип dtype. & quot; существует ли какая-либо «принуждение», вариант, который можно использовать для выброса этой строки вместо сбоя? – sparrow 1 September 2016 в 15:33
  • 4
    @sparrow может быть, но в прошлый раз, когда я использовал его, у него были ошибки. Он может быть исправлен в последней версии панд. error_bad_lines=False, warn_bad_lines=True должен сделать трюк. В документации говорится, что он действителен только для синтаксического анализатора. Он также говорит, что синтаксический анализатор по умолчанию - «Нет», что затрудняет определение того, какой из них является значением по умолчанию. – firelynx 2 September 2016 в 06:48
  • 5
    @nealmcb Вы можете прочитать dataframe с nrows=100 в качестве аргумента, а затем сделать df.dtypes, чтобы увидеть dtypes, который вы получаете. Однако, читая весь файл данных с этими типами данных, обязательно сделайте try/except, чтобы вы уловили ошибочные догадки dtype. Данные грязные, вы знаете. – firelynx 19 December 2016 в 09:17

У меня была аналогичная проблема с файлом ~ 400 МБ. Установка low_memory = False сделала трюк для меня. Сначала делайте простые вещи, я бы проверял, что ваш фреймворк не больше вашей системной памяти, перезагрузитесь, очистите оперативную память перед продолжением. Если вы все еще сталкиваетесь с ошибками, стоит убедиться, что ваш CSV-файл в порядке, быстро просмотрите Excel и убедитесь, что нет очевидной коррупции. Сломанные исходные данные могут привести к хаосу ...

0
ответ дан Dr Nigel 21 August 2018 в 14:26
поделиться
  • 1
    Добавим dtype=unicode: NameError: name 'unicode' is not defined. Но, кажется, работает unicode в кавычках (как в «unicode»)! – sedeh 19 February 2015 в 19:06
  • 2
    @sedeh Вы можете указать типы dtypes либо как типы python, либо как numpy.dtype('unicode'). Когда вы дадите опцию dtype строку, она попытается выполнить ее по фабрике numpy.dtype() по умолчанию. Задание 'unicode' на самом деле ничего не сделает, юникоды просто повышаются до objects. Вы получите dtype='object' – firelynx 15 July 2015 в 07:35

Как упоминалось ранее firelynx, если dtype явно указано, и есть смешанные данные, которые несовместимы с этим dtype, тогда загрузка будет аварийна. Я использовал такой конвертер как обходной путь для изменения значений с несовместимым типом данных, чтобы данные все равно могли быть загружены.

def conv(val):
    if not val:
        return 0    
    try:
        return np.float64(val)
    except:        
        return np.float64(0)

df = pd.read_csv(csv_file,converters={'COL_A':conv,'COL_B':conv})
7
ответ дан sparrow 21 August 2018 в 14:26
поделиться
Другие вопросы по тегам:

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