pandas - символ новой строки разделяет строку на несколько строк при чтении и записи csv

Моя задача - прочитать файл CSV из одного места, выполнить некоторые манипуляции с памятью в кадре данных, а затем поместить файл в другое место.

Исходный файл '||' разделены, и целевой файл должен быть разделен.

Я делаю это для нескольких файлов с разными столбцами.

В одном из исходных CSV один из столбцов содержит новую строку char внутри столбца.

пример исходного CSV-файла:

id||notes<CR><LF>
1||notesLine1<CR><LF>
2||notesLine1<CR><LF>
notesLine2<CR><LF>
3||notesLine1: notesLine2<CR><LF>

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

код:

...
df_target = pd.read_csv(source_file, dtype = None, parse_dates= True, keep_default_na= False,header=None,sep="\|\|",engine='python', encoding='utf-8'))

df_target.to_csv(target_file,header=header_list,index=False,quoting=csv.QUOTE_ALL)
...

текущий выход:

"id","notes"<CR><LF>
"1","notesLine1"<CR><LF>
"2","notesLine1"<CR><LF>
"notesLine2",""<CR><LF>      -- extra unwanted row being created
"3","notesLine1: notesLine2"<CR><LF>

обратите внимание, что строка разделена на две части, что означает, что всего строк будет 4 строки. Я не хочу, чтобы это произошло!

ожидаемый результат:

"id","notes"<CR><LF>
"1","notesLine1"<CR><LF>
"2","notesLine1 \n notesLine2",""<CR><LF>
"3","notesLine1: notesLine2"<CR><LF>

примечание: вместо разделения на две строки я могу иметь «\ n» и данные в одной строке. чтобы всего строк было 3, а не 4.

Есть ли способ справиться с этим?


person Anant Vaibhav    schedule 03.08.2020    source источник


Ответы (2)


CR и LF — управляющие символы, закодированные соответственно 0x0D (десятичное число 13) и 0x0A (десятичное число 10).

Они используются для обозначения разрыва строки в файле.

person Subasri sridhar    schedule 03.08.2020
comment
Спасибо, но как эта информация полезна для проблемы, о которой я просил? - person Anant Vaibhav; 04.08.2020

Посмотрите, поможет ли это:

with open("sample.csv", 'r+') as file:
    text = str();
    for line in file:
        
        if line[0].isdigit() == True:
            text = "{}\n{}".format(text, line.strip())
        else:
            text = "{} {}".format(text, line.strip())
    file.seek(0);
    file.write(text[1:])

Пример скриншотов ввода и вывода файлов1

person Subasri sridhar    schedule 04.08.2020
comment
Если вы хотите использовать '\n' явно, замените оператор else следующим образом: ``` else: text = {} \\n {}.format(text, line.strip()); ``` - person Subasri sridhar; 04.08.2020
comment
Спасибо за ответ! Это работает, однако это зависит от первого символа строки и проверки его цифры. Это может привести к сбою, если есть буквенно-цифровой. Как я могу управлять этим? Обратите внимание, что столбец «ID» может иметь буквенно-цифровое значение, например «ts001». Могу ли я использовать некоторую логику разделения и проверить буквенно-цифровую? - person Anant Vaibhav; 05.08.2020