Чтение и разделение CSV-файла, содержащего строки с запятыми в

У меня есть файл .csv, который выглядит примерно так:

1,2,"a,b",3
4,"c,d",5,6

Который я читаю и сохраняю в массиве следующим образом:

with open(filename, 'r') as f:
    data = f.readlines()
data = [line.split(',') for line in data]

Что приводит к такому массиву:

[['1','2','"a','b"','3']['4','"c','d"','5','6']]

ОДНАКО, я хотел бы сохранить элементы в двойных кавычках, таких как «a, b», в одном элементе массива данных (именно так они открываются в Excel), например:

[[1,2,'a,b',3][4,'c,d',5,6]]

Есть ли простой способ добиться этого в Python?

Обновлено: желательно без использования модуля csv, если это возможно?

Вы можете использовать модуль csv

dcg 09.12.2020 17:16

Или вы также можете реализовать свой собственный парсер

dcg 09.12.2020 17:18

@dcg Я пытался не использовать это, чтобы все было чисто и просто, но если это единственный способ...

sdunnim 09.12.2020 17:19

Я думаю, проще использовать csv, чем делать это самому

dcg 09.12.2020 17:20

Использование модуля csv, который является частью стандартной библиотеки, действительно лучший выбор. Он прост в использовании (см. мой ответ, использующий его ниже), и вы можете быть уверены, что все возможные проблемы, такие как эта, цитирование и т. д., были правильно решены и что вы не столкнетесь с ошибкой в ​​​​какой-то крайний случай.

Thierry Lathuille 09.12.2020 17:24
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
5
2 031
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы должны использовать модуль csv:

import csv

with open('test.csv') as f:
    reader = csv.reader(f)
    
    for row in reader:
        print(row)

Выход:

['1', '2', 'a,b', '3']
['4', 'c,d', '5', '6']

Или, если вы не хотите лениво читать строки и хотите, чтобы все они были в одном списке, как в вашем вопросе, вы можете просто сделать:

with open('test.csv') as f:
    reader = csv.reader(f)
    data = list(reader)

print(data)        
# [['1', '2', 'a,b', '3'], ['4', 'c,d', '5', '6']]   

Используя модуль csv:

import csv

with open('test.csv') as file:
    reader = csv.reader(file)
    
data = [row for row in reader]

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