Как заставить Python смотреть только на запятые без пробела до или после в качестве разделителей

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

Моя текущая проблема заключается в том, что, хотя файл разделен запятыми, не все запятые являются разделителями.

Только запятые, которым НЕ предшествует и/или после которых ставится пробел, должны считаться разделителями. (только ",", а не "," или ",").

Вот как выглядит мой код:

import csv

#open file for reading
with open(mypath, 'r', encoding = 'utf_8') as csvfile:
    myfile = list(csv.reader(csvfile, dialect = 'excel', delimiter = ','))
    #specifying columns to be deleted
    BadCols = [29,28,27,25,21,20,19,18,16,15,14,13,12,11,8,7,4,3] 
    #Loop through column indices to be deleted
    for col in BadCols:        
        #Loop through each row to delete columns
        for i, row in enumerate(myfile):
            #Delete Column, which is basically a list item at that row
            myfile[i].pop(col)


#Open file for writing
with open(mypath2, "w", encoding = 'utf_8', newline='') as csvfile:
    csv_file = csv.writer(csvfile, dialect = 'excel', delimiter = ',')
    for i, row in enumerate(myfile):
        for j, col in enumerate(row):
            csvfile.write('%s, ' %col)
        csvfile.write('\n')
csvfile.close

Вот как выглядят мои данные:

Date,Name,City
May 30, 2016,Ryan,Boston

Вот что я хотел бы видеть, когда я открываю файл с помощью Excel:

Date            Name    City
May 30, 2016    Ryan    Boston

Вот что я на самом деле вижу в Excel:

Date     [Blank column name]    Name   City
May 30   2016                   Ryan   Boston

Таким образом, дата читается как два элемента вместо одного.

Любая помощь будет принята с благодарностью.


person Othman    schedule 22.06.2016    source источник
comment
CSV и разделитель полей также используются в качестве содержимого без кавычек - дрожь, я предлагаю в качестве быстрого взлома сначала заменить все хорошие разделители нестандартным символом (скажем, вертикальной чертой (|)), который не появляется в другом месте в файле, чем разделить на этот или позволить модулю csv проанализировать его с помощью специального диалекта или автоматического определения, и все готово. Но, может быть, здесь слишком поздно вечером ;-) или если справа, всегда две запятые хорошо разбираются справа простым line.rsplit(',', 2) или тому подобным. +1 за ответ @padraic-cunningham   -  person Dilettant    schedule 23.06.2016
comment
У вас есть не правильный файл CSV. Исправить файл...   -  person Bakuriu    schedule 25.06.2016
comment
Для тех, кто сталкивается с той же проблемой, вы также можете попробовать библиотеку Pandas, особенно если предложенное Падраиком решение вам не подходит. Он очень прост в использовании.   -  person Othman    schedule 27.06.2016


Ответы (1)


Регулярное выражение может быть вашим лучшим выбором:

import re

patt = re.compile(r"\b,\b")
with open("in.csv") as f:
    for row in map(patt.split, f):
        print(row)

Что даст вам:

['Date', 'Name', 'City\n']
['May 30, 2016', 'Ryan', 'Boston']

Вам придется позаботиться о конце пробела, но это не должно быть большой проблемой. Очевидно, вы также столкнулись бы с проблемами, если бы у вас было "foo,bar" в качестве имени, т.е. но если нет, подход re будет в порядке.

Другим вариантом может быть замена ", " или " ," только пробелом:

import csv
import re

patt = re.compile(r"\s(,)|(,)\s")

with open("in.csv") as f:
    for line in csv.reader(map(lambda s: patt.sub(" ", s), f)):
        print(line)

Таким образом, для:

Date,Name,City
May 30, 2016,Ryan,Boston
May 31 ,2016,foo,Narnia

Вы получите:

['Date', 'Name', 'City']
['May 30 2016', 'Ryan', 'Boston']
['May 31 2016', 'foo', 'Narnia']
person Padraic Cunningham    schedule 22.06.2016