Pandas не считает, что разделитель - utf-8 'кодек не может декодировать байт 0xe0 [duplicate]

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

В большинстве случаев вы склонны думать о расширенное присвоение (a += b) как точно эквивалентное простому присваиванию (a = a + b). С этим можно столкнуться, хотя в одном случае. Позвольте мне объяснить:

Путем простого задания Python означает, что если a передается в функцию (например, func(a), обратите внимание, что Python всегда передается по ссылке), тогда a = a + b не будет изменять переданный a. Вместо этого он просто изменит локальный указатель на a.

Но если вы используете a += b, то он иногда реализуется как:

a = a + b

или иногда (если существует метод) как:

a.__iadd__(b)

В первом случае (до тех пор, пока a не объявляется глобальным), побочные эффекты отсутствуют за пределами локальной области, так как присвоение a является просто обновлением указателя.

In второй случай, a фактически изменит сам себя, поэтому все ссылки на a будут указывать на модифицированную версию. Это демонстрируется следующим кодом:

def copy_on_write(a):
      a = a + a
def inplace_add(a):
      a += a
a = [1]
copy_on_write(a)
print a # [1]
inplace_add(a)
print a # [1, 1]
b = 1
copy_on_write(b)
print b # [1]
inplace_add(b)
print b # 1

Итак, трюк заключается в том, чтобы избежать расширенного назначения аргументов функции (я пытаюсь использовать его только для переменных локального / циклического). Используйте простое назначение, и вы будете в безопасности от неоднозначного поведения.

5
задан DSM 17 June 2015 в 19:22
поделиться

1 ответ

Работа с некотируемыми разделителями всегда является неприятностью. В этом случае, поскольку похоже, что разбитый текст, как известно, окружен тремя правильно закодированными столбцами, мы можем восстановить. TBH, я бы просто использовал стандартный Python-ридер и однажды создал DataFrame:

import csv
import pandas as pd

with open("semi.dat", "r", newline="") as fp:
    reader = csv.reader(fp, delimiter=";")
    rows = [x[:1] + [';'.join(x[1:-2])] + x[-2:] for x in reader] 
    df = pd.DataFrame(rows)

, который производит

       0                                              1  2  3
0  12012               My Name is Mike. What is your's?  3  0
1   1522  In my opinion: It's cool; or at least not bad  4  0
2  21427                    Hello. I like this feature!  5  1

. Тогда мы можем немедленно сохранить его и получить что-то правильно указано:

In [67]: df.to_csv("fixedsemi.dat", sep=";", header=None, index=False)

In [68]: more fixedsemi.dat
12012;My Name is Mike. What is your's?;3;0
1522;"In my opinion: It's cool; or at least not bad";4;0
21427;Hello. I like this feature!;5;1

In [69]: df2 = pd.read_csv("fixedsemi.dat", sep=";", header=None)

In [70]: df2
Out[70]: 
       0                                              1  2  3
0  12012               My Name is Mike. What is your's?  3  0
1   1522  In my opinion: It's cool; or at least not bad  4  0
2  21427                    Hello. I like this feature!  5  1
5
ответ дан DSM 21 August 2018 в 02:38
поделиться
  • 1
    Работает отлично. Это приятное обходное решение. Благодаря! Во всяком случае, есть ли способ подключиться к парсеру pandas и сделать расщепление и соединение материала «на лету». ? – Thomas Pazur 18 June 2015 в 10:17
Другие вопросы по тегам:

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