2012-04-18 15 views
0

私はちょうどPHPの後にPythonを学んだし、それは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のように見える-_-

+2

これはちょうど良いpythonです。 –

+2

[適切な4-spaceインデント](http://www.python.org/dev/peps/pep-0008/#indentation)でより細かくなります:p – ThiefMaster

答えて

4

大丈夫です。もちろん、あなたは次のようなことをするかもしれません:

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

しかし、あなたのバリアントは読みやすくなります。

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またはdictを生成する関数(ThiefMaster's answerなど)を使用できます。ここ

代替ソリューションは、あなたのデータを保持するクラスを作成することです。その後、

def Person: 
    def __init__(self, nick, surname, phone, address, email, etc): 
     self.nick = nick 
     self.surname = surname 
     ... 

そして、自分の価値観を展開するスプラット演算子を使用して、あなたのリストを構築する:

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

これは、適切な場所ですここではデータを扱う方法を作っていないと、クラスは必要以上に強力です。あなたがそうするなら、それは価値があるかもしれません。

+0

そうでしょうか?しないでください。それはほとんど読めません。 – ThiefMaster

+0

おそらく ''行内に '' for line.split() 'を意味していました。... –

+0

私のコメントをすべて投稿するために投稿していました。 –

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)(からライン)を決して忘れない:可読性がカウントされます。

4

あなたは車輪を再発明しているので、あなたのコードはPHPのようです。しないでください!

import csv 

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

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

ファイルはすべてこのようです。確かに、それはそうであるようです、もしそうなら、これはより良い答えです。 –

+0

Python 2を使用している場合、csvファイルのファイルモードは 'rb'でなければなりません(ただし、csvファイルを書き込むときはバイナリモードが重要です)。 –

関連する問題