2016-09-18 2 views
0

У меня есть файл CSV с одним столбцом, у которого есть имя и фамилия человека. Я пытаюсь использовать CSV для разделения каждого имени на два столбца, первый и последний. Приведенный ниже код разбивает все первые имена на одну строку и все последние имена на одну строку вместо того, чтобы иметь первое имя в строке, а последнее имя в следующем столбце - первое имя. Спасибо за ваше время.Как написать dict в csv

Код: импорт CSV

with open('fullnames.csv','r') as f: 
reader = csv.reader(f) 
newcsvdict = {"first name": [], "last name": []} 
for row in reader: 
    first = row[0].split()[0] 
    last = row[0].split()[1] 
    newcsvdict["first name"].append(first) 
    newcsvdict["last name"].append(last) 


with open('new.csv','w') as f: 
w = csv.DictWriter(f, newcsvdict.keys()) 
w.writeheader() 
w.writerow(newcsvdict) 

Выходные: enter image description here

+0

'w.writerows (newcsvdict)' – ozgur

+1

FYI, 'first, last = row [0] .split()'. –

+0

Вставка кода плохо отформатирована и содержит как минимум две ошибки синтаксиса. Поскольку структура данных преобразуется из сопоставления значений ключа (словаря) в значения, разделенные запятыми, является полностью вашим решением, единственным вопросом здесь является «как написать файл csv», но ваш «вопрос» в том виде, действительно спрашивайте об этом или о любом другом вопросе. – OJFord

ответ

1

В этом простом случае мало пользы в использовании csv.DictWriter, просто использовать csv.writer:

import csv 

header = ['first name', 'last name'] 
with open('fullnames.csv', 'r') as infile, open('new.csv', 'w') as outfile: 
    writer = csv.writer(outfile) 
    writer.writerow(header) 
    writer.writerows(row[0].split() for row in csv.reader(infile)) 

Это прекрасно работает при условии, что имя столбца во входном файле CSV всегда состоит ровно из одной имени и одна фамилия разделяется пробелами. Однако, если могут быть двуствольные фамилии, например. Хелена Бонэм Картер, вам нужно быть более осторожным в том, чтобы разделить имя. Это может сработать:

row[0].split(' ', 1) 

но он предполагает, что разделитель - это ровно одно пространство.

0

Вы можете использовать панда написать CSV (вы могли бы реально использовать панд для всей проблемы), то это будет автоматически транспонировать вам данные от строки колонок до перечня строк:

import pandas as pd 
df = pd.DataFrame(newcsvdict) 
df.to_csv('new.csv', index=False) 
0

Вы создаете один список задниц с ключом. Либо используйте Pandas, либо предложите @maxymoo, либо напишите каждую строку отдельно.

import csv 

with open(r'~/Documents/names.csv', 'r') as fh: 
    reader = csv.reader(fh) 
    with open(r'~/Documents/output.csv', 'w+') as o: 
     writer = csv.writer(o) 
     for row in reader: 
      output = row[0].split(' ', 1) 
      writer.writerow(output) 
Смежные вопросы