2012-04-22 99 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() 

我們需要讓這個程序可以在多個文件,而不是一個,而是該程序仍然必須將所有文件視爲一個大文件。另外,如果其中一個文件沒有以新行結尾,我們必須添加一個新行。我試過這個,但問題是這會在每個文件的末尾添加一個新行,無論它最初是否以新行結束。加上我的語法是錯誤的開始。每次嘗試運行修改後的程序時都會收到錯誤消息。

而且我還必須添加新的選項。我有獨特的工作,但我應該做的另一個選擇是無替換,這使得每個輸出行只出現在最大輸入次數(如果我們不使用-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:哦,等等,明白了。哎呦。我只需要無替換選項的幫助。我想我應該逐行將它分開並將其存儲在列表中以檢查每次?有沒有更高效的方法(只使用我已經編寫的模塊,我們不能使用其他任何東西)

+1

先重構*,然後*擴充。 – 2012-04-22 03:06:32

+0

我會從'itertools'看'chain' – 2012-04-22 03:23:20

+0

不幸的是,我允許使用的唯一模塊是給定的和字符串。 – 2012-04-22 03:43:03

回答

2

首先,你需要讀取第一個輸入文件。所以你需要打開()你讀的第一個輸入文件。 要添加換行符,請修改while循環以檢查文件(在打開()它)後是否在最後有一個新行,如果沒有,則將其放在那裏。

爲了實現無替換選項,您需要一些方法來檢查您是否已經讀取了一行。爲了分割你的線讀取一個文件,只是使用

input.split('\n') 

你randline構造函數獲得通過的文件的內容,所以它正試圖在構造函數中做沒有意義。

對不起,如果這個答案似乎沒有道理;我已經通過並試圖指出你需要修復的不同事情。我不能評論這些東西,因爲我沒有名譽,所以我必須發表一個答案:。讓我知道如果這有幫助!


不做替換,我會做一個字典,保存字符串作爲鍵,並作爲值整數。遍歷所有輸入文本,並且每次看到一行時,將它添加到字典中並遞增相關的整數。然後,當您調用chooseline時,請檢查並確保字典中您從拾取隨機行獲得的字符串值大於0.如果是,則減小相關值,然後返回您選擇的字符串。否則,請選擇一個新行。


回覆編輯2.0: 您可以這樣做。然後,每次你選擇一個隨機線,你從列表中刪除它。我認爲這會奏效。

+0

是的,我忘了它是一個文件,而不是一秒鐘的字符串。我有那種固定的(除了額外的換行符)。至於沒有更換,我想我可以拆分輸入並將其存儲在一個列表中,並使用計數函數來檢查我嘗試輸出的每一行。 – 2012-04-22 04:07:52

+0

哦,doi。字典會工作太過於。不過謝謝,這有很多幫助。 – 2012-04-22 04:40:14