0

一連の従業員の姓名、ID 番号、性別、経験年数をリストしたテキスト ファイルがあります。最初の行には、従業員数が含まれています。これは、employees.txt と呼ばれます。ここにあります:

7

ジョン

ドウ

33

272838

M

メアリー

ジョンソン

38

3849383

オピー

6

839293

M

ミッシー

4

238392

ジョン

ブラ

28

834282

M

アメリア

スピエン

2

5789812

シェーン

カセンシュテン

2

567891

M


この情報を辞書のリストに整理し、すべての女性従業員を見つけて、姓と名を出力したいと考えています。辞書のリストは取得できますが、女性従業員の名前を検索して出力しようとするとエラーが発生します。これが私のコードです:

def employee_write(file):
    employee_dict = {}
    employee_dict["First"] = file.readline().strip()
    employee_dict["Last"] = file.readline().strip()
    employee_dict["Experience"] = file.readline().strip()
    employee_dict["ID"] = file.readline().strip()
    employee_dict["Gender"] = file.readline().strip()
    return employee_dict

def female_print(x2):
    for term in x2:
        for word in employee_dict:
            if employee_dict["Gender"] == "F":
                print(employee_dict["First"])
                print(employee_dict["Last"])

def main():
    file = open("employees.txt", "r")
    n = int(file.readline())
    x1 = employee_write(file)
    employee_list = []
    for i in range(n):
        employee_list.append(x1)
        x2 = employee_list
    print(x2)
    female_print(x2)

main()

ここで私のエラーは何ですか? 「employee_dict」という名前が定義されていないと表示されるため、female_print() 関数が機能していません。どうしたの?

4

3 に答える 3

1

変数の命名と使用法を理解するのに苦労しているので、少し簡略化しました。

def employee_write(file):
    employee_dict = {}
    employee_dict["First"] = file.readline().strip()
    employee_dict["Last"] = file.readline().strip()
    employee_dict["Experience"] = file.readline().strip()
    employee_dict["ID"] = file.readline().strip()
    employee_dict["Gender"] = file.readline().strip()
    return employee_dict

def female_print(employee_list):
    for employee in employee_list:
        if employee["Gender"] == "F":
            print(employee["First"])
            print(employee["Last"])

def main():
    file = open("employees.txt", "r")
    n = int(file.readline())
    employee_list = []
    for i in range(n):
        employee_list.append(employee_write(file))
    print(employee_list)
    female_print(employee_list)

main()

利回り

[{'Gender': 'M', 'Last': 'Doe', 'ID': '272838', 'Experience': '33', 'First': 'John'}, {'Gender': 'F', 'Last': 'Johnson', 'ID': '3849383', 'Experience': '38', 'First': 'Mary'}, {'Gender': 'M', 'Last': 'Dog', 'ID': '839293', 'Experience': '6', 'First': 'Opie'}, {'Gender': 'F', 'Last': 'Dog', 'ID': '238392', 'Experience': '4', 'First': 'Missy'}, {'Gender': 'M', 'Last': 'Bla', 'ID': '834282', 'Experience': '28', 'First': 'John'}, {'Gender': 'F', 'Last': 'Spien', 'ID': '5789812', 'Experience': '2', 'First': 'Amelia'}, {'Gender': 'M', 'Last': 'CasenStien', 'ID': '567891', 'Experience': '2', 'First': 'Shane'}]
Mary
Johnson
Missy
Dog
Amelia
Spin

それはあなたが望むものですか?

于 2013-03-15T20:31:10.673 に答える
0

ここには 2 つの (主要な) 問題があります。1 つには、実際にファイル全体を読み取っているわけではありません。最初のレコードを (x1 として) 読み込んでから、そのレコードをリストに N 回追加します。印刷物から、レコードが 1 つしか取得されていないことがわかります。

また、あなたの print_female 関数は存在しない変数 "employee_dict" を参照しています - おそらくそれをどこかで定義する必要があります。おそらく、「用語」を使用するつもりでしたか?これにより、スタック トレースがスローされます。

これら 2 つの問題を修正すれば、コードの基本的な前提は健全になります。

于 2013-03-15T20:34:58.020 に答える
0

ではmain、関数employee_write(おそらくemployee_read代わりに呼び出す必要があります) は1 回だけ呼び出されます。

代わりに次のようにしてみてください。

In [1]: with open('employees.txt', 'r') as ef:
    txt = ef.read()
   ...:     

In [2]: lines = txt.split()

In [3]: records = [lines[i:i+5] for i in xrange(1, len(lines), 5)]

In [4]: records
Out[4]: [['John', 'Doe', '33', '272838', 'M'], ['Mary', 'Johnson', '38', '3849383', 'F'], ['Opie', 'Dog', '6', '839293', 'M'], ['Missy', 'Dog', '4', '238392', 'F'], ['John', 'Bla', '28', '834282', 'M'], ['Amelia', 'Spien', '2', '5789812', 'F'], ['Shane', 'CasenStien', '2', '567891', 'M']]

In []: for r in records:
    print r
   ....:     
['John', 'Doe', '33', '272838', 'M']
['Mary', 'Johnson', '38', '3849383', 'F']
['Opie', 'Dog', '6', '839293', 'M']
['Missy', 'Dog', '4', '238392', 'F']
['John', 'Bla', '28', '834282', 'M']
['Amelia', 'Spien', '2', '5789812', 'F']
['Shane', 'CasenStien', '2', '567891', 'M']

注意: このコードは、入力ファイルが正しくフォーマットされていることを前提としています!

于 2013-03-15T20:43:40.527 に答える