0

宿題のために Python でコーディングすることについて質問がありますが、最初に、これまで Python でコーディングしたことがないことを述べておく必要があります。この課題は、私たちが基本に慣れるためのものであるため、事前に知識が不足していることをお詫びします (そして非常に長い投稿)。

私たちの仕事は、ファイル randline.py を変更することです (ここではその独自性を示しています)。

import random, sys
from optparse import OptionParser

class randline:
    def __init__(self, filename):
        f = open(filename, 'r')
        self.lines = f.readlines()
        f.close()

    def chooseline(self):
        return random.choice(self.lines)

def main():
    version_msg = "%prog 2.0"
    usage_msg = """%prog [OPTION]... FILE

Output randomly selected lines from FILE."""

    parser = OptionParser(version=version_msg,
                          usage=usage_msg)
    parser.add_option("-n", "--numlines",
                      action="store", dest="numlines", default=1,
                      help="output NUMLINES lines (default 1)")
    options, args = parser.parse_args(sys.argv[1:])

    try:
        numlines = int(options.numlines)
    except:
        parser.error("invalid NUMLINES: {0}".
                     format(options.numlines))
    if numlines < 0:
        parser.error("negative count: {0}".
                     format(numlines))
    if len(args) != 1:
        parser.error("wrong number of operands")
    input_file = args[0]

    try:
        generator = randline(input_file)
        for index in range(numlines):
            sys.stdout.write(generator.chooseline())
    except IOError as (errno, strerror):
        parser.error("I/O error({0}): {1}".
                     format(errno, strerror))

if __name__ == "__main__":
    main()

プログラムが 1 つだけではなく複数のファイルを取り込めるようにする必要がありますが、それでもプログラムはすべてのファイルを 1 つの大きなファイルであるかのように扱う必要があります。また、ファイルの 1 つが新しい行で終わっていない場合は、新しい行を追加する必要があります。私はこれを試しましたが、問題は、最初に新しい行で終わるかどうかに関係なく、各ファイルの最後に新しい行が追加されることです。さらに、そもそも構文が間違っています。変更したプログラムを実行しようとするたびにエラーが発生します。

また、新しいオプションを追加する必要があります。私は独自の作業をしていますが、私が作成することになっている別のオプションは置換なしです。これにより、各出力行が入力として表示された最大回数だけ表示されるようになります (-u を使用しない場合)オプションの場合、出力が重複する可能性があるのは、最初から入力ファイルで重複していた場合のみです)。セットは自動的にすべての重複を取り除き、出力行が置換なしで書き込まれるようにしたいだけなので、私の方法が間違っていることはわかっています。しかし、他に何を使用できるかわかりません。

import random, sys, string
from optparse import OptionParser

version_msg = "%prog 2.0"
usage_msg = """%prog [OPTION]... FILE

Output randomly selected lines from FILE"""
parser = OptionParser(version=version_msg,
                      usage=usage_msg)
parser.add_option("-n", "--numlines",
                  action="store", dest="numlines", default=1,
                  help="output NUMLINES lines (default 1)")
parser.add_option("-u", "--unique", action="store_true",
                  dest="unique", default=False,
                  help="ignores duplicate lines in a file")
parser.add_option("-w", "--without-replacement", action="store_true",
                  dest="without", default=False,
                  help="prints lines without replacement")
options, args = parser.parse_args(sys.argv[1:])

without = bool(options.without)
unique = bool(options.unique)
try:
    numlines = int(options.numlines)
except:
    parser.error("invalid NUMLINES: {0}".
         format(options.numlines))

def main():
    if numlines < 0:
        parser.error("negative count: {0}".
                     format(numlines))

    ##Here is one of the major changes
    input_file = args[0]
    count = 0
    while (count < len(args)-1):
        input_file = input_file + '\n' + args[count + 1]
        count = count + 1

    ##And here
    try:
        generator = randline(input_file)
        for index in range(numlines):
            if options.without:
                line = generator.chooseline()
                if line not in no_repeat:
                    sys.stdout.write(line)
                    no_repeat.add(line)
            else:
                sys.stdout.write(generator.chooseline())
    except IOError as (errno, strerror):
        parser.error("I/O error({0}): {1}".
                     format(errno, strerror))

class randline:
    def __init__(self, filename):
    if unique:
        uniquelines = set(open(filename).readlines())
        f = open(filename, 'w').writelines(set(uniquelines))
        f = open(filename, 'r')
    if without:
        countlines = len(f.readlines())
        if (countlines < numlines):
        parser.error("too few lines in input".
                 format(without))
        self.lines = f.readlines()
        f.close()

    def chooseline(self):
        return random.choice(self.lines)

if __name__ == "__main__":
    main()

要するに、(すべてのファイルを 1 つの長いファイルとして扱いながら) 複数のファイルを正しく読み取ることができず、置換なしオプションも正しく機能しません。

編集: ああ、引数リストにファイル名を渡していたので、テキスト ファイルであっても文字列として扱われないことに気付きました。私はそれを変更しようとしましたが、それでも正確には機能しません:

input_file = args[0]
count = 0
content = open(args[0]).read()
while (count < len(args) - 1):
content = content  + open(args[count + 1]).read()
    count = count + 1
open(input_file, 'wb').write(content)
try:
    generator = randline(input_file)

2 つのファイルの間に余分な改行を追加し続けます。ファイルを 1 行ずつ結合したいのですが、最初のファイルの終わりと 2 番目のファイルの始まりの間に空白行ができてしまいます。

編集 2.0: 待って、わかった。おっと。交換なしのオプションについてサポートが必要です。行ごとに分割し、リストに保存して毎回チェックする必要があると思いますか? より効率的な方法はありますか (既に作成したモジュールのみを使用し、他には何も使用できません)

4

1 に答える 1

2

まず、最初の入力ファイルを読み取る必要があります。そのため、最初に読んだ入力ファイルも open() する必要があります。改行を追加するには、while ループを変更して、ファイル (open() を実行した後) の最後に改行があるかどうかを確認し、そうでない場合はそこに挿入します。

置換なしオプションを実装するには、すでに行を読んだかどうかを確認する方法が必要です。読み込んだファイルを行ごとに分割するには、次を使用します

input.split('\n')

ランドライン コンストラクターにはファイルの内容が渡されるため、コンストラクターで何をしようとしているのか意味がありません。

この回答が意味をなさないと思われる場合は申し訳ありません。修正が必要なさまざまな点を指摘しようとしました。評判がないのでコメントできないので、回答を投稿する必要があります:. これが役立つかどうか教えてください!


置換せずに行うには、文字列をキーとして保持し、int を値として保持する辞書を作成します。すべての入力テキストをループし、行が表示されるたびに、それを辞書に追加し、関連する整数を増やします。次に、chooseline を呼び出すときに、ランダムな行を選択して取得した文字列の辞書の値が 0 より大きいことを確認します。0 より大きい場合は、関連する値を減らしてから、選択した文字列を返します。それ以外の場合は、新しい行を選択してください。


編集 2.0 への返信: できます。次に、ランダムな行を選択するたびに、リストから削除します。それはうまくいくと思います。

于 2012-04-22T04:04:23.263 に答える