(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, но позже я не смог разделить по запятым по той же причине, запятые появляются в строках, поэтому вместо этого я использовал цикл для проверки того, нахожусь ли я внутри кавычек, и вручную создавал свои поля