私は宿題のために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行ずつ分割し、それを毎回チェックするリストに保管するべきだと思いますか?より効率的な方法がありますか(私がすでに書いたモジュールを使って、他のものを使うことはできません)
リファクタリングまず、*その後*オーグメント。 –
私は ' –
は、残念ながら、私が使用を許可されてるだけのモジュールは、これらの与えられた文字列されているitertools'からchain''になります。 –