Разделить текст в csv другим разделителем, но с сохранением запятой в каждом столбце

У меня есть текстовый файл, содержащий pipe | значения с разделителями, но, к сожалению, я столкнулся с некоторыми ошибками, csv DictReader предположил, что запятая в столбце на самом деле является n значениями для n столбцов. я пробовал

скипинициалспейс = Истина

параметр, но это не сработало.

Мой текстовый файл, test.csv;

Name|Company|Age|Gender|Fav Color|Fav Food
John|Custom Inc|23|Male|Red, Blue, Yellow|Chocolate
Mary|Troopers   , Inc|25|Female|Black|Chocolate
Riki|Dorw Technology|33|Male|White, Yellow, Black|Ice cream, pudding

Мой код:

import csv

name= []
company = []
age = []
gender = []
fav_color = []
fav_food = []

with open("test.csv", "rU") as f:
    reader = csv.Dictreader(f, delimiter = '|')
    for row in reader:
        name.append(row['Name'])
        company.append(row['Company'])
        age.append(row['Age'])
        gender.append(row['Gender'])
        fav_color.append(row['Fav Color'])
        fav_food.append(row['Fav Food'])

RESULT_ADD = [[] for _ in range(len(name))]
for attr in range(len(name)):
    RESULT_ADD[attr].append(name[attr])
    RESULT_ADD[attr].append(company[attr])
    RESULT_ADD[attr].append(age[attr])
    RESULT_ADD[attr].append(gender[attr])
    RESULT_ADD[attr].append(fav_color[attr])
    RESULT_ADD[attr].append(fav_food[attr])
    
with open("result.csv", "w") as newfile:
    header = ['NAME_OF_CEO', 'NAME_OF_COMPANY' , 'AGE', 'GENDER', 'FAV_COLOR', 'FAV_FOOD']
    wr.csv.writer(newfile, delimiter= ';', quoting = csv.QUOTE_MINIMAL)
    wr.writerow(header)
    for item in RESULT_ADD:
        wr.writerow(item)

Что я получил;

NAME_OF_CEO;NAME_OF_COMPANY;AGE;GENDER;FAV_COLOR;FAV_FOOD
John;Custom Inc;23;Male;Red,Blue,Yellow;Chocolate
Mary;T,r,o,o,p,e,r,s,,, ,I,n,c;25;Female;Black;Chocolate
Riki;Dorw Technology;33;Male;White,Yellow,Black;Ice cream,pudding

Первая проблема здесь;

Для Джона FAV_COLOR содержит красный, а FAV_FOOD содержит синий, а следующий безымянный столбец содержит желтый и такой же, как банан, расположенный в следующем пустом безымянном столбце.

Для Mary, T,r,o,o,p,e,r,s,,, ,I,n,c , при открытии в LibreOffice слово Troopers находилось в NAME_OF_THE_COMPANY, а Inc — в столбце AGE, затем возраст 25 располагался в следующем столбце, FAV_COLOR и т. д.,

У Рики те же проблемы, что и у Джона


person yunaranyancat    schedule 04.05.2017    source источник
comment
Вы пытались изменить company.append(['Компания']) на company.append(row['Компания'])?   -  person imran    schedule 04.05.2017
comment
@imran извините, это опечатка, отредактировано.   -  person yunaranyancat    schedule 04.05.2017
comment
Я протестировал ваш код с Python 2.7 и Python 3.6 и не могу воспроизвести ваш результат. Я получаю новый файл с правильным количеством столбцов, разделенных ; символами. Вы уверены, что код, который вы вставили сюда, вызывает неправильный вывод?   -  person Craig    schedule 04.05.2017


Ответы (1)


Вы можете попробовать использовать pandas, так как фреймы данных очень полезны для работы с табличными данными:

import pandas as pd
df = pd.read_csv("test.csv", sep = "|")
df.to_csv("result.csv", sep=";")

Таким образом, вам не нужно будет поддерживать и заполнять отдельные списки для каждого атрибута. Как только вы привыкнете к фреймам данных, они великолепны.

Что касается импорта в LibreOffice, я не проверял это, но согласно документации https://help.libreoffice.org/Calc/Importing_and_Exporting_CSV_Files:

Если поле или ячейка содержит запятую, поле или ячейка должны быть заключены в одинарные (') или двойные кавычки (").

Надеюсь, это поможет!

person Germán Aquino    schedule 04.05.2017