6

テキスト ファイルの行からデータを抽出する必要があります。データは、次のようにフォーマットされた名前とスコアリング情報です。

Shyvana - 12/4/5 - Loss - 2012-11-22
Fizz - 12/4/5 - Win - 2012-11-22
Miss Fortune - 12/4/3 - Win - 2012-11-22

このファイルは、私の小さな python プログラムの別の部分によって生成されます。ここでは、ユーザーに名前を尋ね、名前のリストから有効であることを確認するために入力した名前を検索し、キル、デス、アシスト、勝ったかどうかを尋ねます。または紛失。次に、確認を求めてそのデータをファイルの新しい行に書き込み、そのように最後に日付を追加します。そのデータを準備するコード:

data = "%s - %s/%s/%s - %s - %s\n" % (
        champname, kills, deaths, assists, winloss, timestamp)

基本的に、プログラムの別の部分でそのデータを読み込んでユーザーに表示し、特定の名前の経時的な平均などの計算を行いたいと考えています。

私はPythonを初めて使用し、一般的なプログラミングの経験があまりないため、見つけた文字列の分割とフォーマットの例のほとんどは、ここで必要なものに適応する方法を理解するにはあまりにも不可解です。誰か助けてください? トークンの検索が簡単になるように、書き込まれたデータを別の形式にすることもできますが、ファイル内で直接簡単にしたいのです。

4

5 に答える 5

10

以下は、プレイヤー名でキー付けされた辞書にすべてを読み込みます。各プレーヤーに関連付けられた値は、それ自体がディクショナリであり、さらなる処理に適した形式に変換されたアイテムに関連付けられた名前付きフィールドを持つレコードとして機能します。

info = {}
with open('scoring_info.txt') as input_file:
    for line in input_file:
        player, stats, outcome, date = (
            item.strip() for item in line.split('-', 3))
        stats = dict(zip(('kills', 'deaths', 'assists'),
                          map(int, stats.split('/'))))
        date = tuple(map(int, date.split('-')))
        info[player] = dict(zip(('stats', 'outcome', 'date'),
                                (stats, outcome, date)))

print('info:')
for player, record in info.items():
    print('  player %r:' % player)
    for field, value in record.items():
        print('    %s: %s' % (field, value))

# sample usage
player = 'Fizz'
print('\n%s had %s kills in the game' % (player, info[player]['stats']['kills']))

出力:

info:
  player 'Shyvana':
    date: (2012, 11, 22)
    outcome: Loss
    stats: {'assists': 5, 'kills': 12, 'deaths': 4}
  player 'Miss Fortune':
    date: (2012, 11, 22)
    outcome: Win
    stats: {'assists': 3, 'kills': 12, 'deaths': 4}
  player 'Fizz':
    date: (2012, 11, 22)
    outcome: Win
    stats: {'assists': 5, 'kills': 12, 'deaths': 4}

Fizz had 12 kills in the game

または、ほとんどのデータを辞書に保持するのではなく、ネストされたフィールドへのアクセスが少し厄介にinfo[player]['stats']['kills']なる可能性があります — — 代わりに、もう少し高度な「ジェネリック」クラスを使用してそれらを保持することができます。これにより、info2[player].stats.kills代わりに書き込むことができます。

Struct例として、C 言語のstructデータ型に多少似ているため、私が名前を付けたクラスを使用してほぼ同じことを示します。

class Struct(object):
    """ Generic container object """
    def __init__(self, **kwds): # keyword args define attribute names and values
        self.__dict__.update(**kwds)

info2 = {}
with open('scoring_info.txt') as input_file:
    for line in input_file:
        player, stats, outcome, date = (
            item.strip() for item in line.split('-', 3))
        stats = dict(zip(('kills', 'deaths', 'assists'),
                          map(int, stats.split('/'))))
        victory = (outcome.lower() == 'win') # change to boolean T/F
        date = dict(zip(('year','month','day'), map(int, date.split('-'))))
        info2[player] = Struct(champ_name=player, stats=Struct(**stats),
                               victory=victory, date=Struct(**date))
print('info2:')
for rec in info2.values():
    print('  player %r:' % rec.champ_name)
    print('    stats: kills=%s, deaths=%s, assists=%s' % (
          rec.stats.kills, rec.stats.deaths, rec.stats.assists))
    print('    victorious: %s' % rec.victory)
    print('    date: %d-%02d-%02d' % (rec.date.year, rec.date.month, rec.date.day))

# sample usage
player = 'Fizz'
print('\n%s had %s kills in the game' % (player, info2[player].stats.kills))

出力:

info2:
  player 'Shyvana':
    stats: kills=12, deaths=4, assists=5
    victorious: False
    date: 2012-11-22
  player 'Miss Fortune':
    stats: kills=12, deaths=4, assists=3
    victorious: True
    date: 2012-11-22
  player 'Fizz':
    stats: kills=12, deaths=4, assists=5
    victorious: True
    date: 2012-11-22

Fizz had 12 kills in the game
于 2012-11-22T23:52:56.620 に答える
3

分割('-')を使用してパーツを取得し、次にもう一度数値を取得します。

for line in yourfile.readlines ():
    data = line.split (' - ')
    nums = [int (x) for x in data[1].split ('/')]

data[]とnums[]で必要なすべてのものを取得する必要があります。または、reモジュールを使用して、その正規表現を作成することもできます。ただし、これはそれほど複雑ではないようです。

于 2012-11-22T23:45:42.173 に答える
3
# Iterates over the lines in the file.
for line in open('data_file.txt'):
    # Splits the line in four elements separated by dashes. Each element is then
    # unpacked to the correct variable name.
    champname, score, winloss, timestamp = line.split(' - ')

    # Since 'score' holds the string with the three values joined,
    # we need to split them again, this time using a slash as separator.
    # This results in a list of strings, so we apply the 'int' function
    # to each of them to convert to integer. This list of integers is
    # then unpacked into the kills, deaths and assists variables
    kills, deaths, assists = map(int, score.split('/'))

    # Now you are you free to use the variables read to whatever you want. Since
    # kills, deaths and assists are integers, you can sum, multiply and add
    # them easily.
于 2012-11-22T23:50:31.850 に答える
3

テキストファイルの例からデータを読み取る方法は 2 つあります。

最初の方法

Python の csv モジュールを使用して、区切り文字が-.

http://www.doughellmann.com/PyMOTW/csv/を参照してください。

2番目の方法

または、この csv モジュールを使用したくない場合はsplit、ファイルの各行を文字列として読み取った後に、メソッドを使用するだけです。

f = open('myTextFile.txt', "r")
lines = f.readlines()

for line in lines:
    words = line.split("-")   # words is a list (of strings from a line), delimited by "-".

したがって、上記の例でchampnameは、実際にはwordsリストの最初の項目になりwords[0]ます。

于 2012-11-22T23:41:57.887 に答える
1

まず、行をデータフラグメントに分割します

>>> name, score, result, date = "Fizz - 12/4/5 - Win - 2012-11-22".split(' - ')
>>> name
'Fizz'
>>> score
'12/4/5'
>>> result
'Win'
>>> date
'2012-11-22'

次に、スコアを解析します

>>> k,d,a = map(int, score.split('/'))
>>> k,d,a
(12, 4, 5)

最後に、日付文字列を日付オブジェクトに変換します

>>> from datetime import datetime    
>>> datetime.strptime(date, '%Y-%M-%d').date()
datetime.date(2012, 1, 22)

これで、すべてのパーツが解析され、データ型に正規化されました。

于 2012-11-22T23:49:02.923 に答える