我有一個關於在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()
我們需要讓這個程序可以在多個文件,而不是一個,而是該程序仍然必須將所有文件視爲一個大文件。另外,如果其中一個文件沒有以新行結尾,我們必須添加一個新行。我試過這個,但問題是這會在每個文件的末尾添加一個新行,無論它最初是否以新行結束。加上我的語法是錯誤的開始。每次嘗試運行修改後的程序時都會收到錯誤消息。
而且我還必須添加新的選項。我有獨特的工作,但我應該做的另一個選擇是無替換,這使得每個輸出行只出現在最大輸入次數(如果我們不使用-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()
綜上所述,我不能讓它正確讀取多個文件(同時還處理所有的文件作爲一個長文件),並且沒有替代選項不正確工作的。
編輯︰啊,我意識到,因爲我是在參數列表中傳遞文件名,所以即使他們只是文本文件,他們不被視爲字符串。我試圖改變它,但它仍然無法確切地工作:
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.0:哦,等等,明白了。哎呦。我只需要無替換選項的幫助。我想我應該逐行將它分開並將其存儲在列表中以檢查每次?有沒有更高效的方法(只使用我已經編寫的模塊,我們不能使用其他任何東西)
先重構*,然後*擴充。 – 2012-04-22 03:06:32
我會從'itertools'看'chain' – 2012-04-22 03:23:20
不幸的是,我允許使用的唯一模塊是給定的和字符串。 – 2012-04-22 03:43:03