Как преобразовать CSV-файл с одним столбцом в словарь в Python? - PullRequest
0 голосов
/ 01 ноября 2018

Мне нужна помощь с заданием для python. Задача - преобразовать файл .csv в словарь и внести некоторые изменения. Проблема в том, что файл .csv получил только 1 столбец, но 3 строки.

Файл .csv выглядит так в Excel

             A                         B

1.male Bob West
2.female Hannah South
3.male Bruce North

Итак, все в столбце А.

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

import csv
reader = csv.reader(open("filename.csv"))
d={}
for row in reader:
    d[row[0]]=row[0:]
print(d)

А на выходе

{'\ufeffmale Bob West': ['\ufeffmale Bob West'], 'female Hannah South': 
['female Hannah South'], 'male Bruce North': ['male Bruce North']}

но я хочу

{1 : Bob West, 2 : Hannah South, 3 : Bruce North}

Мужчина / женщина должны быть изменены с ID, (1,2,3). И я не знаю, как выяснить, что такое 1 столбец.

Заранее спасибо.

Ответы [ 5 ]

0 голосов
/ 01 ноября 2018

Мне нравится использовать Панд для подобных вещей. Вы можете использовать Панды, чтобы импортировать ее, а затем экспортировать в диктовку.

import pandas as pd

df = pd.read_csv('test.csv',header=-1)
# Creates new columns in the dataframe based on the rules of the question
df['Name']=df[0].str.split(' ',1).str.get(1)
df['ID'] = df[0].str.split('.',1).str.get(0)

Фрейм данных должен иметь три столбца:

  • 0 - это необработанные данные.
  • Имя - имя, определенное в задаче.
  • ID - число, предшествующее периоду.

Я не включил пол, но он действительно не вписывается в диктат. Я также предполагаю, что ваши данные не имеют заголовка.

Следующая часть преобразует ваш фрейм данных pandas в нужный вам вывод.

output_dict = dict()
for i in range(len(df[['ID','Name']])):
    output_dict[df.iloc[i]['ID']] = df.iloc[i]['Name']
0 голосов
/ 01 ноября 2018
import cv with open('Employee_address.txt', mode='r') as CSV_file:
    csv_reader= csv.DirectReader(csv_file)
    life_count=0
    for row in csv_reader:
        if line_count==0:
            print(f'columns names are {",".join()}')
            line += 1
            print(f'\t{row["name"]} works in the {row["department"]} department, and lives in{row["living address"]}.line_count +=1 print(f'Processed {line_count} lines.')
0 голосов
/ 01 ноября 2018

согласно Simit, но используя регулярные выражения и понимая, что ваши 1. и A и B вы просто пытаетесь объяснить идентификаторы ячеек и столбцов Excel

import re, csv

reader = csv.reader(open("data.csv"))

out = {}
for i, line in enumerate(reader, 1):
    m = re.match(r'^(male|female) (.*)$', line)
    if not m:
        print(f"error processing {repr(line)}")
        continue
    out[i] = m[2]

print(out)
0 голосов
/ 01 ноября 2018

Вы можете использовать диктовку и перечислять объект csv,

import csv

reader = csv.reader(open("filename.csv"))

x = {num+1:name[0].split(" ",1)[-1].rstrip() for (num, name) in enumerate(reader)}
print(x)

# output,
{1: 'Bob West', 2: 'Hannah South', 3: 'Bruce North'}

Или вы можете сделать это без использования модуля csv, просто прочитав файл,

with open("filename.csv", 'r') as t:
    next(t) # skip first line
    x = {num+1:name.split(" ",1)[-1].strip() for (num, name) in enumerate(t)}

print(x)

# output,
{1: 'Bob West', 2: 'Hannah South', 3: 'Bruce North'}
0 голосов
/ 01 ноября 2018

Это должно работать для данного ввода:

data.csv:

1.male Bob West,
2.female Hannah South,
3.male Bruce North,

Код:

import csv

reader = csv.reader(open("data.csv"))

d = {}

for row in reader:
  splitted = row[0].split('.')
  # print splitted[0]
  # print ' '.join(splitted[1].split(' ')[1:])
  d[splitted[0]] = ' '.join(splitted[1].split(' ')[1:])

print(d)

выход

{'1': 'Bob West', '3': 'Bruce North', '2': 'Hannah South'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...