(python) Как разделить csv с /n, если поля содержат строки с /n внутри?

У меня проблемы с разбиением csv, потому что некоторые поля содержат "\n" внутри

я использую:

file_data = csv_file.read().decode("utf-8")
csv_data = file_data.split("\n")

но поля выглядят примерно так

'string 1','string 2',
'string
 3'
'string 4',

я хочу, чтобы csv_data[0] были строками 1 и 2, csv_data[1] - строкой 3, а csv_data[2] - строкой 4

при том способе, который я сейчас использую, я получаю csv_data[0] правильно, но строка 3 разбивается на два индекса, так как она имеет /n внутри текста...

Вам следует использовать библиотеку csv вместо того, чтобы пытаться разобрать его самостоятельно.

Вот ссылка, которая может помочь вам

Используйте библиотеку. В Python есть модуль csv [Python-doc] для разбора файлов csv. Я настоятельно советую использовать парсер, так как формат CSV-файлов сложнее, чем кажется, например, существует синтаксис для указания кавычек и новых строк в качестве содержимого строки.

Вы можете разобрать содержимое csv и, например, создать список списков с:

import csv

with open('mycsv.csv') as mycsv:
    csvreader = csv.reader(mycsv)
    data = [tuple(row) for row in csvreader]

Я решил эту проблему, не используя split, вместо этого итерируя csv_data следующим образом:

        csv_file = request.FILES["csv_upload"]

        if not csv_file.name.endswith('.csv'):
            messages.warning(request, "O arquivo não é um csv!")
            return HttpResponseRedirect(request.path_info)

        file_data = csv_file.read().decode("utf-8")
        csv_data = file_data.split("\r\n")

        fields = []
        fieldsTemp = []

        # pegando os campos do csv
        text = ''
        firstQuote = False
        secondQuote = False
        for x in csv_data:
            for char in x:
                # removendo a virgulas de separação
                if char != ',':
                    text = text + char

                # tratando strings que contém virgula
                if char == '\"':
                    if firstQuote:
                        secondQuote = True
                    firstQuote = True
                    if secondQuote:
                        firstQuote = False
                        secondQuote = False

                # adicionando o campo
                if not firstQuote:
                    if char == ',':
                        fieldsTemp.append(text)
                        text = ''
            fields.append(fieldsTemp)
            fieldsTemp = []

Как оказалось, я мог разделить по /r/n и это решило бы часть проблемы для моего конкретного csv, но позже я не смог разделить по запятым по той же причине, запятые появляются в строках, поэтому вместо этого я использовал цикл для проверки того, нахожусь ли я внутри кавычек, и вручную создавал свои поля

Вернуться на верх