CSV Writer (Python) с CRLF вместо LF

Привет, я пытаюсь использовать библиотеку для преобразования моего файла CSV в новый.

Код, который я написал, следующий:

      import csv
import re

file_read=r'C:\Users\Comarch\Desktop\Test.csv'
file_write=r'C:\Users\Comarch\Desktop\Test_new.csv'

def find_txt_in_parentheses(cell_txt):
    pattern = r'\(.+\)'
    return set(re.findall(pattern, cell_txt))

with open(file_write, 'w', encoding='utf-8-sig') as file_w:
    csv_writer = csv.writer(file_w, lineterminator="\n")
    with open(file_read, 'r',encoding='utf-8-sig') as file_r:
        csv_reader = csv.reader(file_r)
        for row in csv_reader:
            cell_txt = row[0]
            txt_in_parentheses = find_txt_in_parentheses(cell_txt)
            if len(txt_in_parentheses) == 1:
                txt_in_parentheses = txt_in_parentheses.pop()
                cell_txt_new = cell_txt.replace(' ' + txt_in_parentheses,'')
                cell_txt_new = txt_in_parentheses + '\n' + cell_txt_new
                row[0] = cell_txt_new
            csv_writer.writerow(row)

Проблема только в том, что в итоговом файле ( Test_new.csv ) вместо. Вот пример изображения:

  • читать файл слева
  • напишите файл справа:

Можно ли написать свой код с использованием csv библиотека так что LF остается внутри ячейки вместо CRLF.

2 ответа

Из документации г. csv.reader

Если csvfileявляется файловым объектом, его следует открывать с помощью 1
[...]

Сноски

1(1,2) Если не указано, новые строки, встроенные в поля в кавычках, не будут интерпретироваться правильно, а на платформах, использующих \r\nнакладки на доп. \rбудет добавлено. Всегда должно быть безопасно указывать newline='', так как модуль csv выполняет собственную (универсальную) обработку новой строки.

Это именно та проблема, которую вы видите. Так...

      with open(file_read, 'r', encoding='utf-8-sig', newline='') as file_r, \
     open(file_write, 'w', encoding='utf-8-sig', newline='') as file_w:
     
    csv_reader = csv.reader(file_r, dialect='excel')
    csv_writer = csv.writer(file_w, dialect='excel')

    # ...

Вы работаете в Windows и открываете файл в режиме «w», который дает вам окончание строк в стиле Windows. Использование режима «wb» должно дать вам предпочтительное поведение.

Другие вопросы по тегам