Python 从文本文件到字典

Python 从文本文件到字典,python,csv,dictionary,Python,Csv,Dictionary,我是一个txt文件,将字符串作为我正在创建的字典的第一个键,其余的值作为元组。前面有一个标题,我已经让我的代码在开始时“忽略”了它 txt值的示例: "Ronald Reagan","1981","8","69","California","Republican" "George Bush","1989","4","64","Texas","Republican" "Bill Clinton","1993","8","46","Arkansas","Democrat" 我想创建提供以下输出的字

我是一个txt文件,将字符串作为我正在创建的字典的第一个键,其余的值作为元组。前面有一个标题,我已经让我的代码在开始时“忽略”了它

txt值的示例:

"Ronald Reagan","1981","8","69","California","Republican"
"George Bush","1989","4","64","Texas","Republican"
"Bill Clinton","1993","8","46","Arkansas","Democrat"
我想创建提供以下输出的字典:

{"Ronald Reagan": (1981,8,69,"California", "Republican") etc.}
这是我目前的代码:

def read_file(filename):
    d={}
    f= open(filename,"r")
    first_line = f.readline()
    for line in f:
        #line=line.strip('"')
        #line=line.rstrip()
        data=line.split('"')
        data=line.replace('"', "")

        print(data)


        key_data=data[0]

        values_data= data[1:]
        valuesindata=tuple(values_data)
        d[key_data]=valuesindata

    print(d)

read_file(filename)
第一个print语句(我把它放在那里只是为了看看当时的输出是什么,它给了我以下信息:

Ronald Reagan,1981,8,69,California,Republican
George Bush,1989,4,64,Texas,Republican
等等。当它到达第二个打印语句时,它会执行以下操作:

{'R': ('o', 'n', 'a', 'l', 'd', ' ', 'R', 'e', 'a', 'g', 'a', 'n', ',', '1', '9', '8', '1', ',', '8', ',', '6', '9', ',', 'C', 'a', 'l', 'i', 'f', 'o', 'r', 'n', 'i', 'a', ',', 'R', 'e', 'p', 'u', 'b', 'l', 'i', 'c', 'a', 'n', '\n'), 'G': ('e', 'o', 'r', 'g', 'e', ' ', 'B', 'u', 's', 'h', ',', '1', '9', '8', '9', ',', '4', ',', '6', '4', ',', 'T', 'e', 'x', 'a', 's', ',', 'R', 'e', 'p', 'u', 'b', 'l', 'i', 'c', 'a', 'n', '\n')}
另外,我在引号处拆分它,因为我的一些字符串包含逗号作为名称的一部分,例如:“Carl,Jr.”


我不想导入csv模块,那么有没有办法呢?

导致这种奇怪结果的代码中的主要问题是
数据
变量是一个字符串,
数据[0]
会给你第一个字符,
数据[1://code>其余的-你需要调用
拆分(“,”)
首先将字符串拆分到列表中

我有一个不导入任何模块的限制

想法是使用
split(“,”)
将每一行拆分为单独的项目,并使用
strip()
删除项目值周围的引号:

d = {}
with open(filename) as f:
    for line in f:
        items = [item.strip('"').strip() for item in line.split(",")]
        d[items[0]] = items[1:]

print(d)
印刷品:

{'Bill Clinton': ['1993', '8', '46', 'Arkansas', 'Democrat'],
 'George Bush': ['1989', '4', '64', 'Texas', 'Republican'],
 'Ronald Reagan': ['1981', '8', '69', 'California', 'Republican']}

仅供参考,使用标准库将使事情变得更简单:

import csv
from pprint import pprint

d = {}
with open(filename) as f:
    reader = csv.reader(f)
    for row in reader:
        d[row[0]] = row[1:]

pprint(d)
您还可以使用字典理解:


导致这种奇怪结果的代码中的主要问题是,
data
变量是一个字符串,
data[0]
将为您提供第一个字符,
data[1://code>其余字符-您需要调用
split(“,”)
,首先将字符串拆分到列表中

我有一个不导入任何模块的限制

想法是使用
split(“,”)
将每一行拆分为单独的项目,并使用
strip()
删除项目值周围的引号:

d = {}
with open(filename) as f:
    for line in f:
        items = [item.strip('"').strip() for item in line.split(",")]
        d[items[0]] = items[1:]

print(d)
印刷品:

{'Bill Clinton': ['1993', '8', '46', 'Arkansas', 'Democrat'],
 'George Bush': ['1989', '4', '64', 'Texas', 'Republican'],
 'Ronald Reagan': ['1981', '8', '69', 'California', 'Republican']}

仅供参考,使用标准库将使事情变得更简单:

import csv
from pprint import pprint

d = {}
with open(filename) as f:
    reader = csv.reader(f)
    for row in reader:
        d[row[0]] = row[1:]

pprint(d)
您还可以使用字典理解:


您可以像alecxe建议的那样使用
csv
模块,也可以像这样“手动”完成:


这将删除双引号,将数值转换为
int
,并创建元组字典。

您可以像alecxe建议的那样使用
csv
模块,也可以像这样“手动”操作:


这将删除双引号,将数值转换为
int
,并创建一个元组字典。

是的,我同意这将使生活更轻松,但我有一个不导入任何模块的限制。是的,我同意这将使生活更轻松,但我有一个不导入任何模块的限制。是的,是的,但我有限,不能不导入任何模块作为限制。是的,是的,但我受到限制,无法导入任何模块作为限制。这对名称中没有逗号的名称很有效。因此它适用于“罗纳德·里根”等名称,但不适用于“小罗纳德·里根”等名称,因为它会将名称拆分为“罗纳德·里根”“小”@Nick True,为此,您需要使用
csv
模块或更复杂的手动处理行;即检查引号中的逗号并以不同方式处理这些边缘情况。您帮了很大忙,我只是不知道如何在不拆分逗号的情况下进行处理。@Nick谢谢,谢谢您'不客气。我也不知道还能做什么……我刚刚制作了一个没有导入的版本,但它并不漂亮。我通过替换所有没有引号包围的逗号(逗号两边的引号表示它是分隔符)实现了这一点通过分隔符元组中的另一个分隔符-但必须确保文本中不存在新的分隔符。然后,在用逗号分割后,用逗号替换新的分隔符……等等,瞧“小罗纳德·里根”:p这对名字中没有逗号的名字很有效。因此它适用于像“罗纳德·里根”这样的名字,但不适用于像“小罗纳德·里根”这样的名字,因为它会把名字分成“罗纳德·里根”和“小罗纳德·里根”@Nick True,为此,您需要使用
csv
模块或更复杂的手动处理行;即检查引号中的逗号并以不同方式处理这些边缘情况。您帮了很大忙,我只是不知道如何在不拆分逗号的情况下进行处理。@Nick谢谢,谢谢您'不客气。我也不知道还能做什么……我刚刚制作了一个没有导入的版本,但它并不漂亮。我通过替换所有没有引号包围的逗号(逗号两边的引号表示它是分隔符)实现了这一点通过分隔符元组中的另一个分隔符-但必须确保文本中不存在新的分隔符。然后,在用逗号分割后,用逗号替换新的分隔符……等等,瞧,“小罗纳德·里根”:P