Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何以python风格编写此示例?_Python - Fatal编程技术网

如何以python风格编写此示例?

如何以python风格编写此示例?,python,Python,我刚刚在PHP之后学习python,它的python风格对我来说非常奇怪。 我在征求您的建议,如何在python上编写此代码: data = [] for line in file: name, surname, phone, address, email, etc = line.split(";", 6) data.append( {'nick': nick, 'surname': surname, 'phone': phone, 'address': address, 'email'

我刚刚在PHP之后学习python,它的python风格对我来说非常奇怪。 我在征求您的建议,如何在python上编写此代码:

data = []
for line in file:
  name, surname, phone, address, email, etc = line.split(";", 6)
  data.append( {'nick': nick, 'surname': surname, 'phone': phone, 'address': address, 'email':  email, 'etc': etc} )

我的代码看起来像PHP--

您可以在这里使用列表:

[{'nick': nick, 'surname': surname, 'phone': phone, 'address': address, 'email':  email, 'etc': etc} for name, surname, phone, address, email, etc in (line.split(";", 6) for line in file)]
然而,由于它的长度,这是很难阅读的

要构造数据,可以使用或生成dict的函数(如中所示)

另一种解决方案是创建一个类来保存数据:

def Person:
   def __init__(self, nick, surname, phone, address, email, etc):
       self.nick = nick
       self.surname = surname
       ...
然后使用splat运算符构造列表以解压缩值:

data = [Person(*line.split(";", 6)) for line in file]

这适用于您打算对数据做更多工作的地方-这里的经验法则是,如果您不使用任何方法来处理数据,那么类的功能将超出您的需要。如果您这样做,这可能是值得的。

我将使用函数进行解析,然后使用
map()
在每行调用它:

def _parse_user_line(line):
    name, surname, phone, address, email, etc = line.split(';', 6)
    return {'nick': nick, 'surname': surname, 'phone': phone, 
            'address': address, 'email':  email, 'etc': etc}

data = map(_parse_user_line, file)
将返回的列表分配给单个变量,然后只使用
字段[0]
字段[1]
等,这也是一个好主意。它们将位于dict键旁边,因此每个人都知道它们是什么:

def _parse_user_line(line):
    u = line.split(';', 6)
    return {'nick': u[0], 'surname': u[1], 'phone': u[2], 
            'address': u[3], 'email': u[4], 'etc': u[5]}

data = map(_parse_user_line, file)
现在,我们可以将以下理念结合起来,让这一点变得更加美好:



永远不要忘记(从中的一行)(又名导入此代码):可读性很重要。没关系。当然,您可以这样做:

data.append(dict(zip(('name', 'surname', 'phone', 'address', 'email', 'etc'),
                     line.split(";", 6))))

但是您的变体更具可读性。

您的代码看起来像php,因为您正在重新发明轮子。不要

import csv

fieldnames = ['name', 'surname', 'phone', 'address', 'email']

with open('something', 'r') as f:
    data = list(csv.DictReader(f, fieldnames, delimiter=';'))

如果:p假定文件都是这样的,则会更好。诚然,这似乎是可能的,如果是这样,这是更好的答案。如果使用Python 2,csv文件的文件模式应该是“rb”(尽管在编写csv文件时二进制模式更重要)。
import csv

fieldnames = ['name', 'surname', 'phone', 'address', 'email']

with open('something', 'r') as f:
    data = list(csv.DictReader(f, fieldnames, delimiter=';'))