如何在Python中将只有一列的csv文件转换为字典?

3
我可以帮忙翻译Python作业的一项任务,需要将一个.csv文件转换成字典并进行一些更改,但是问题在于.csv文件只有1列而不是3行。在Excel中,.csv文件看起来像这样:
             A                         B

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

所有内容都在A列中。

我的代码目前看起来像这样:

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) 来代替。我不知道如何解决第一列的问题。
提前致谢。

如果所有内容都在同一列中,那不是一个真正的CSV文件,而只是普通文本文件。 - Barmar
我不被允许对csv文件进行更改。 - gmanread
你需要自己解析文本。正则表达式可能对此有用。 - Barmar
你能粘贴你整个 CSV 文件的内容吗? - Sufiyan Ghori
就像问题中所描述的那样。 - gmanread
显示剩余4条评论
5个回答

1
你可以使用字典推导式并枚举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

这应该适用于给定的输入:

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'}

追踪(Traceback)(最近的调用在最上面): 第11行,在<module>中 d[splitted[0]] = ' '.join(splitted[1].split(' ')[1:1]) 索引错误:列表索引超出范围 - gmanread
看起来你的数据格式不正确...这个字符:\ufeff - Sumit
尝试在Excel中操作。A列,第1行:男性Bob West / 第2行:女性Hannah South / 第3行:男性Bruce North。仍然出现列表索引超出范围的错误。 - gmanread

0
根据Simit的说法,但使用正则表达式,并意识到你的1.AB只是在尝试解释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)

追溯(Traceback)最新的一次调用: , 第 8 行 in <module> m = re.match(r'^([0-9]+).(male|female) (.*)$', line) NameError: name 're' is not defined - gmanread
re 是 Python 中的标准模块。 - Sam Mason
对我来说不起作用。回溯(最近的调用): 第7行,在<module>中 m = re.match(r'^(male|female) (.*)$', line) File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/re.py", line 173, in match return _compile(pattern, flags).match(string) TypeError: 预期是字符串或类似字节的对象 - gmanread

0
我喜欢使用Pandas来处理这样的东西。你可以使用Pandas将其导入,然后导出为字典。
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-这是原始数据。
  • Name-问题中定义的名称。
  • ID-句点之前的数字。

我没有包含性别,但它真的无法适应字典。我还假设您的数据没有标题。

下一部分将您的Pandas数据框转换为所需的输出字典。

output_dict = dict()
for i in range(len(df[['ID','Name']])):
    output_dict[df.iloc[i]['ID']] = df.iloc[i]['Name']

-2
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.')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接