CSV-файл с указанной запятой нельзя правильно разделить на Python

def csv_split() : raw = [ '"1,2,3" , "4,5,6" , "456,789"', '"text":"a,b,c,d", "gate":"456,789"' ] cr = csv.reader( raw, skipinitialspace=True ) for l in cr : print len( l ), l 

Эта функция выводит следующее:

 3 ['1,2,3 ', '4,5,6 ', '456,789'] 6 ['text:"a', 'b', 'c', 'd"', 'gate:"456', '789"'] 

Как вы можете сказать, первая строка правильно разделена на 3 записи. Но вторая строка НЕ. Я бы ожидал, что читатель csv разделит его на два, вместо этого у нас здесь 6. Я также думал о подходах регулярных выражений, но он предполагает некоторый конкретный цитирующий диалект.

В основном я хочу: просто разделите строку всякий раз, когда есть «,», которая не цитируется в паре «».

Есть ли быстрый и общий способ сделать это? Я видел некоторые хакеры регулярных выражений, которые предполагают, что все поданные ВСЕГДА цитируются и т. Д. Я думаю, что могу написать небольшую петлю, которая делает это очень неэффективно, но, безусловно, оценят еще более квалифицированные советы. Большое спасибо!

2 Solutions collect form web for “CSV-файл с указанной запятой нельзя правильно разделить на Python”

CSV не является стандартизованным форматом, но обычно избегать кавычек, используя два "" если они появляются внутри текста (например, "text"":""a,b,c,d" ). Читатель CSV от Python делает правильные вещи здесь, потому что предполагает это соглашение. Я не совсем уверен, что вы ожидаете от вывода, но вот моя попытка сделать очень простой CSV-ридер, который может подойти вашему формату. Не стесняйтесь приспосабливать его соответствующим образом.

 raw = [ '"1,2,3" , "4,5,6" , "456,789"', '"text":"a,b,c,d", "gate":"456,789"', '1,2, 3,' ] for line in raw: i, quoted, row = 0, False, [] for j, c in enumerate(line): if c == ',' and not quoted: row.append(line[i:j].strip()) i = j + 1 elif c == '"': quoted = not quoted row.append(line[i:j+1].strip()) for i in range(len(row)): if len(row[i]) >= 2 and row[i][0] == '"' and row[i][-1] == '"': row[i] = row[i][1:-1] # remove quotation marks print row 

Вывод:

 ['1,2,3', '4,5,6', '456,789'] ['text":"a,b,c,d', 'gate":"456,789'] ['1', '2', '3', ''] 

Оставляя это здесь для потомков, потому что я слишком много боролся с этим.

Аргумент quotechar для csv.reader() помогает решить эту проблему; он позволит вам игнорировать делимы (т. е. запятые в этом сценарии), если они находятся внутри кавычек (при условии, что все запятые внутри записей были указаны). То есть, это сработает для этого:

 Name, Message Ford Prefect, Imagine this fork as the temporal universe. Arthur Dent, "Hey, I was using that!" 

… где запятая была вложена внутри кавычек, но в строке без запятой нет.

Демонстрационный код вырвался из документов Py2 и отредактирован таким образом, что delimiter является запятая (duh), а quotechar – ваша двойная кавычка:

 import csv with open('eggs.csv', 'rb') as csvfile: spamreader = csv.reader(csvfile, delimiter=',', quotechar='"') for row in spamreader: print ', '.join(row) 
  • Поиск замены шаблонов с использованием лямбда
  • Как добавить конечную косую черту для приложения для категоризации Django MPTT?
  • Как использовать регулярные выражения сделать обратный поиск?
  • Удаление непечатаемых символов «gremlin» из текстовых файлов
  • Массовая строка заменяется на python?
  • Используйте Python для извлечения длин ветвей из Newick Format
  • Как python и модуль регулярных выражений обрабатывают обратную косую черту
  • Почему конечное повторение в lookbehind не работает в некоторых вариантах?
  • Найти / заменить URL-адрес в документе с помощью регулярного выражения Python
  • python: шаблон поиска регулярных выражений для двоичных файлов (половина байта)
  • Как я могу гарантировать, что мое регулярное выражение Python выводит словарь?
  • Python - лучший язык программирования в мире.