如何以python风格编写此示例?
我刚刚在PHP之后学习python,它的python风格对我来说非常奇怪。 我在征求您的建议,如何在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'
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=';'))