CSV DictReader,如何强制将“”中的一部分作为列表而不是字符串读取

2024-06-16 08:56:23 发布

您现在位置:Python中文网/ 问答频道 /正文

在个人.CSV文件看起来像:

Firstname,Surname,Birth Year,Hobby
John,Smith,1990,"tenis,piano"
Andrew,Josh,1988,"surfing,art"

我想在程序爱好将表示为列表而不是字符串。我怎么能强迫那个听写器?在

我使用的python代码如下所示:

^{pr2}$

输出如下:

{'Birth Year': '1990', 'Hobby': 'tenis,piano', 'Surname': 'Smith', 'Firstname': 'John'}
{'Birth Year': '1988', 'Hobby': 'surfing,art', 'Surname': 'Josh', 'Firstname': 'Andrew'}
Birth Year: 1990, Hobby: tenis,piano, Surname: Smith, Firstname: John, 
tenis,piano
Birth Year: 1988, Hobby: surfing,art, Surname: Josh, Firstname: Andrew, 
surfing,art

我希望霍比在构造器中被打包到列表中:

(...)
Birth Year: 1990, Hobby: ['tenis','piano'], Surname: Smith, Firstname: John, 
['tenis', 'piano']
Birth Year: 1988, Hobby: ['surfing','art'], Surname: Josh, Firstname: Andrew, 
['surfing', 'art']

Tags: csv列表surnamefirstnamejohnyearsmithbirth
3条回答
class MyDictReader(csv.DictReader):
    def next(self):
        if self.line_num == 0:
            # Used only for its side effect.
            self.fieldnames
        row = self.reader.next()
        self.line_num = self.reader.line_num

        # unlike the basic reader, we prefer not to return blanks,
        # because we will typically wind up with a dict full of None
        # values
        while row == []:
            row = self.reader.next()
        row = map(lambda x:x.split(",") if "," in x else x,row)
        d = dict(zip(self.fieldnames, row))
        lf = len(self.fieldnames)
        lr = len(row)
        if lf < lr:
            d[self.restkey] = row[lf:]
        elif lf > lr:
            for key in self.fieldnames[lr:]:
                d[key] = self.restval
        return d

当您阅读中的行时,您需要split()爱好字段:

one_row = {'Birth Year': '1990', 'Hobby': 'tenis,piano', 'Surname': 'Smith', 'Firstname': 'John'}
one_row['Hobby'] = one_row['Hobby'].split(',')
one_row
Out[7]: 
{'Birth Year': '1990',
 'Firstname': 'John',
 'Hobby': ['tenis', 'piano'],
 'Surname': 'Smith'}

在您当前的代码中,这将是:

^{pr2}$

您当前的__str__方法无法处理列表,但您只需稍作修改即可解决此问题-使用str将列表值转换为字符串,字符串值不受影响:

def __str__(self):
    s=""
    for k,v in self.__dict__.items():
        s += k + ": " + str(v) + ", "
    return s

我解决它如下。马吕斯你的回答是一种暗示。在

for p  in csvdr:
    #p["Hobby"] = p["Hobby"].split(',') not working, TypeError: cannot concatenate 'str' and 'list' objects

    l=p["Hobby"].split(',') #this will be list
    p["Hobby"]=l #let key show on value being list
    print p
    Person(**p)

我们可以确保:

^{pr2}$

结果:

{'Birth Year': '1990', 'Hobby': ['tenis', 'piano'], 'Surname': 'Smith', 'Firstname': 'John'}
{'Birth Year': '1988', 'Hobby': ['surfing', 'art'], 'Surname': 'Josh', 'Firstname': 'Andrew'}
Birth Year: 1990, Hobby: ['tenis', 'piano']Surname: Smith, Firstname: John, 
['tenis', 'piano']
<type 'list'>
Birth Year: 1988, Hobby: ['surfing', 'art']Surname: Josh, Firstname: Andrew, 
['surfing', 'art']
<type 'list'>
[Finished in 0.1s]

顺便说一下,str需要修改检查类型和适当的治疗清单:

def __str__(self):
    s=""
    for k,v in self.__dict__.items():
        if type(v) is not list:
            s+=k+": "+v+", "
        else:
            s+=k+": "+str(v)    
    return s

我是python的新手,如果有任何关于更好的代码实践的建议,我们将不胜感激。

相关问题 更多 >