文件:删除额外的引用并将列表更改为字典值的元组

时间:2016-04-12 02:16:09

标签: python list file dictionary tuples

我将第一行的文件作为"标题"在其余行中识别字符串及其位置。

文件包含的示例:

"Headline","Newspaper", "Year Published", "Author"
"Crash", "New York Times", "2001", "Smith"
"Fire", "Washington Post", "2010", "Dudley"
"Addiction", "National Enquirer", "2008", "Kuhn"

我已经实现了第一个字符串将成为我字典的键,字符串的其余部分将成为该键的值。现在,我在字典中的值将自己显示为列表。如何更改我的代码以使字典中的值显示为元组?此外,我的代码是在我的键和值上添加一组额外的引号,我试图摆脱它们(见下文)。我还尝试了一个if语句和.isdigit()来识别和删除所有数字上的引号,这些数字将成为字典中值的一部分。

我继续说:

{'"Crash"':[' "New York Times"',' "2001"', '"Smith"'],
'"Fire"':[' "Washington Post"',' "2010"', '"Dudley"']} etc.

我想要的时候:

{"Crash":( "New York Times", 2001, "Smith"),
"Fire":( "Washington Post", 2010, "Dudley")} etc.

我的代码:

def read_file(filename):
    d={}
    f= open(filename,"r")
    first_line = f.readline()
    for line in f:
        line=line.strip('"')
        data=line.split(",")
        key_data=data[0]
        values_data= data[1:5]
        valuesindate=tuple(values_data)
        d[key_data]=values_data
        tupval=tuple(d.values())
        for i in d.values():
            if i.isdigit():
                line=line.strip('"')
                line = line.split()
                line[-1] = line[-1].strip('"\n')
                floats = [float(i) for i in line]
            else:
               pass

        print(d)

read_file(".file0.csv")

忘了提及我(不幸的是)我没有使用csv模块。这肯定会让我的生活变得更轻松。

2 个答案:

答案 0 :(得分:1)

更新:

这里'a'是您从文件中读取的行/行:

<!-- Placed at the end of the document so the pages load faster -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script type="text/javascript" src="js/bootstrap.min.js"></script>
<script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>

我看到你在这里分配其余的名单:

 a = '"Crash", "New York Times", "2001", "Smith"'
 a = a.replace('"', '')  # remove "
 a = a.split(',') #create list
 a = [int(i) if i.strip().isdigit() else i.strip() for i in a] # convert "2001" to 2001 in the list, this will take care of all such integers
 d[a[0]] = tuple(d[a[1:]])  # update your dict

如果你想要一个元组,你应该这样做:

d[key_data]=values_data

或者你已经拥有

d[key_data]= tuple(values_data)

DO

 valuesindate=tuple(values_data)

为了摆脱“在行字符串中的每个元素周围,你需要在分割它之前对行字符串执行string.replace()

答案 1 :(得分:0)

以下是我如何解决这个问题。您可以删除无关的"字符,并将', '上的每一行拆分(逗号后跟空格)。使用元组解包将每个字段分配给适当命名的变量,然后使用这些变量构造字典的元组。

def read_file(filename):
    d = {}
    with open(filename) as f:
        next(f)    # skip header row
        for line in f:
            headline, newspaper, year_published, author = line.strip().replace('"').split(', ')
            d[headline] = (newspaper, int(year_published), author)

    return d

您也可以处理每一行而不解压缩变量并使用拆分行的第一项作为键,但是,解压缩到命名变量提供了一定级别的文档并且非常清楚它是什么,特别是当它到来时将年份转换为整数。