我刚刚在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 -_-
答案 0 :(得分:4)
没关系。当然,你可以这样做:
data.append(dict(zip(('name', 'surname', 'phone', 'address', 'email', 'etc'),
line.split(";", 6))))
但你的变体更具可读性。
答案 1 :(得分:4)
你的代码看起来像php,因为你正在重新发明轮子。不要!
import csv
fieldnames = ['name', 'surname', 'phone', 'address', 'email']
with open('something', 'r') as f:
data = list(csv.DictReader(f, fieldnames, delimiter=';'))
答案 2 :(得分:2)
我会使用函数进行解析,然后使用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)
将返回的列表分配给单个变量然后只使用fields[0]
,fields[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)
现在我们可以通过结合Roman's answer:
的想法来使这更好labels = 'nick surname phone address email etc'.split()
def _parse_user_line(line):
values = line.split(';', 6)
return dict(zip(labels, values))
data = map(_parse_user_line, file)
永远不要忘记(一行)The Zen of Python(又名import this
):可读性计数。
答案 3 :(得分:0)
您可以在此处使用列表理解:
[{'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)]
然而,由于它的长度,这很难阅读。
要构建数据,您可以使用collections.namedtuple
或生成字典的函数(如ThiefMaster's answer中所示)。
此处的另一种解决方案是创建一个用于保存数据的类:
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]
这适用于您打算对数据进行更多工作的地方 - 这里的经验法则是,如果您不使用任何方法处理数据,则类比您需要的更强大。如果你这样做,那可能是值得的。