2012-04-22 10 views
0

私は宿題のためにpythonでコーディングに関する質問がありますが、私はPythonでコード化されたことはないと最初に言及する必要があります。割り当ては私たちに基本に慣れさせてくれるはずなので、知識の欠如(そして実際には長いポスト)のために前もってお詫びします。Pythonプログラムを修正する(python 2.7)

私たちの仕事は、ファイル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つが新しい行で終わらない場合は、新しい行を追加する必要があります。私はこれを試しましたが、問題は、最初に新しい行で終わるかどうかにかかわらず、これは各ファイルの最後に新しい行を追加することです。さらに私の構文は間違っています。変更されたプログラムを実行しようとするたびにエラーが発生します。

また、新しいオプションを追加する必要があります。私はユニークな作業をしていますが、別のオプションは置換えなしで、各出力行は入力として表示された最大回数だけ表示されます(-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() 

、私は(まだ一つの長いファイルとしてすべてのファイルを処理しながら)それは適切に複数のファイルを読むためにとせずに、代替オプションはどちらか正しく動作しないことができません。

EDIT:ああ、私は引数リストにファイル名を渡していたので、テキストファイルだけであっても、文字列として扱われていません。私はそれを変更しようとしたが、それはまだ正確に動作しません:それは2つのファイル間の余分な改行を追加し続け

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番目のファイルが始まるところとの間に空白行がある。

EDIT 2.0:ああ、待ってください。うわー。私は交換なしのオプションで助けが必要です。私はそれを1行ずつ分割し、それを毎回チェックするリストに保管するべきだと思いますか?より効率的な方法がありますか(私がすでに書いたモジュールを使って、他のものを使うことはできません)

+1

リファクタリングまず、*その後*オーグメント。 –

+0

私は ' –

+0

は、残念ながら、私が使用を許可されてるだけのモジュールは、これらの与えられた文字列されているitertools'からchain''に​​なります。 –

答えて

2

まず、最初の入力ファイルを読む必要があります。したがって、読み込んだ最初の入力ファイルをopen()する必要があります。 改行を追加するには、whileループを修正して、ファイル(開いた後に)に新しい行があるかどうかを確認し、見つからない場合はそこに置きます。

置換えのないオプションを実装するには、すでに行を読み終えているかどうかを確認する必要があります。あなたがラインでで読んだファイルを分割するためには、ちょうど意味をなさないコンストラクタでやろうとしていますので、何を、あなたのrandlineコンストラクタは、ファイルの内容を渡さなっている

input.split('\n') 

使用しています。

申し訳ありません。この回答が理にかなっていない場合は、私は、あなたが修正する必要があるさまざまなことを指摘しようとしました。私は評判がないので、私はものにコメントすることはできませんので、私は答えを投稿する必要があります:。これが役に立ったら教えてください!交換せずに行うには


、私は、値としてキー、int型のように文字列を保持している辞書になるだろう。すべての入力テキストをループし、行が表示されるたびにそれを辞書に追加し、関連する整数をインクリメントします。次に、chooselineを呼び出すときに、ランダム行を選択して得た文字列の辞書の値が0より大きいかどうかを確認します。一致する場合は、関連する値を減らしてから選択した文字列を返します。それ以外の場合は、新しい行を選択します。


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

+0

ええ、それはファイルであって、それに2番目の文字列ではないことを忘れていました。私はそのような修正をしました(余分な改行を除いて)。置換えなしの場合は、入力を分割してリストに格納し、カウント関数を使用して出力しようとする各行をチェックすることができたと思います。ああ、doi。 –

+0

辞書はあまりにもうまくいくだろう。ありがとう、それは多くの助けです。 –