Как мне написать код, чтобы определить, является ли символ EOL в CSV-файле `\ r` или` \ n`, не просматривая содержимое файла? - PullRequest
0 голосов
/ 02 января 2019

Я использую Python в Jupyter Notebooks для работы с CSV-файлом.Я пишу один и тот же код в двух разных версиях Jupyter Notebook - одна работает прямо на моем компьютере, а другая - на эмуляторе в онлайн-уроке из Dataquest.Когда я открываю файл CSV и считываю его в строку на компьютере Jupyter Notebook, символ EOL равен \r, но когда я делаю то же самое в эмуляторе Dataquest, символ EOL равен \n.У меня есть два вопроса:

  1. Почему это происходит?

  2. Как я могу написать код Python, который проверяет наличие символа EOL, не открываяфайл для визуального поиска?

Этот код находится в записной книжке Jupyter на моем собственном Mac.

f = open('US_births_1994-2003_CDC_NCHS.csv', 'r')
data_MyComp = f.read()
data_MyComp

Этот код находится в эмуляторе ноутбука Jupyter для Dataquest.

f = open('US_births_1994-2003_CDC_NCHS.csv', 'r')
data_dataquest = f.read()
data_dataquest

Это несколько строк вывода с моего компьютера, когда я запускаю data_MyComp (обратите внимание, что символ EOL \r).

'year,month,date_of_month,day_of_week,births\r1994,1,1,6,8096\r1994,1,2,7,7772\r1994,1,3,1,10142\r1994,1,4,2,11248\r1994,1,5,3,11053\r1994,1,6,4,11406\r1994,1,7,5,11251\r1994,1,8,6,8653\r1994,1,9,7,7910\r1994,1,10,1,10498\r1994,1,11,2,11706\r

Это несколько строквывод из эмулятора Dataquest при запуске data_dataquest (обратите внимание, что символ EOL \n).

'year,month,date_of_month,day_of_week,births\n1994,1,1,6,8096\n1994,1,2,7,7772\n1994,1,3,1,10142\n1994,1,4,2,11248\n1994,1,5,3,11053\n1994,1,6,4,11406\n

1 Ответ

0 голосов
/ 02 января 2019

Без каких-либо указаний на то, как вы загрузили или иным образом сделали файл доступным для Python и Jupyter, мы не можем точно сказать, почему это происходит.Концы строк зависят от платформы, но Python 3 должен, как правило, нейтрализовать различия между платформами, если только вы не просите об открытии файла как «двоичного».

Вы можете обнаружить соглашения о конце строки, просто открыв файл и прочитав достаточноЭто.То, что «достаточно», зависит от типа файла.Возможно, что-то вроде этого в вашем случае:

with open('US_births_1994-2003_CDC_NCHS.csv', 'rb') as peek:
    buf = peek.read(1024)
    if b'\r\n' in peek:
        print("DOS CR/LF line terminator")
    elif b'\r' in peek:
        print("Plain CR seen (legacy Mac or CP/M file)?")
    elif b'\n' in peek:
        print("Plain LF seen (standard Unix text file)")

Это не попытка сделать какой-либо статистический анализ, но может работать достаточно хорошо для вашего ограниченного случая.Файл будет закрыт снова после окончания блока with, так что вы можете просто открыть его второй раз с параметрами, которые вам действительно нужны.

...