Добавление терминатора строки в пандах приводит к добавлению еще одного \ r - PullRequest
0 голосов
/ 19 декабря 2018

Я могу загрузить файл CSV штрафа в кадр данных pandas с настройками по умолчанию:

df = pd.read_csv(file)

>>> df
   distance  recession_velocity
0   # not a row                 NaN
1         0.032               170.0
2         0.034               290.0
3         0.214              -130.0

Однако, как только я добавляю lineterminator, программа, кажется, выходит из строя:

df = pd.read_csv(file, lineterminator='\n')
       distance recession_velocity\r
0   # not a row                   \r
1         0.032                170\r
2         0.034                290\r
3         0.214               -130\r

Файл действительно имеет строчный разделитель \n:

>>> print(repr(open('/Users/david/example.csv').read()))
'distance,recession_velocity\n# not a row,\n0.032,170\n0.034,290\n0.214,-130\n0.263,

В чем здесь проблема, и есть ли способ ее исправить без обрезки всех значений столбца

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Чтобы проконтролировать ответ @ filmor, распечатать не-Python-конвертированные данные и посмотреть, что там на самом деле, используйте двоичный режим.Например:

>>> open('example.csv','r+b').read()
b'distance,recession_velocity\r\n# not a row,\r\n0.032,170\r\n0.034,290\r\n0.214,-130\r\n0.263,-70\r\n0.275,-185\r\n0.275,-220\r\n0.4,200\r\n0.5,290\r\n0.5,270\r\n0.6,200\r\n0.8,300\r\n0.9,-30\r\n0.9,650\r\n0.9,150\r\n0.9,500\r\n1,920\r\n1.1,450\r\n1.1,500\r\n1.4,500\r\n1.7,960\r\n2,500\r\n2,850\r\n2,800\r\n2,1090\r\n# Total,527'

Здесь вы можете видеть, что разделитель строк равен \r\n, хотя без использования режима +b он отображается как \n.Тем не менее, pandas еще не поддерживает многострочные переводчики строк, поэтому возникает другая проблема.

0 голосов
/ 19 декабря 2018

Файловые объекты Python автоматически переведут \r\n в \n в текстовом режиме.read_csv использует свою собственную обработку файлов, вместо этого он действительно увидит \r\n, поэтому, если вы передадите lineterminator="\n", он действительно просто обрежет этот один символ.

Если вы не передадите lineterminatorПараметр вообще, он будет угадывать стиль окончания строки.Вы также можете передать файловый объект вместо пути.Это может немного замедлить ход событий, но при этом вы получите то же поведение при преобразовании, что и при прямом чтении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...