我有一个关于在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()
我们需要这样做,以便程序可以接收多个文件,而不只是一个,但程序仍然必须将所有文件视为一个大文件。此外,如果其中一个文件没有以新行结尾,我们必须添加一个新行。我尝试过这个,但问题是这会在每个文件的末尾添加一个新行,无论它是否最初以新行结束。加上我的语法错误。每次我尝试运行修改后的程序时都会收到错误。
我还必须添加新选项。我有独特的工作,但我应该做的另一个选择是无替换,这使得每个输出行只出现在它作为输入出现的最大次数(如果我们不使用-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:哦等等,明白了。哎呦。我只是需要无替换选项的帮助。我想我应该逐行拆分并将其存储在列表中以便每次检查?有没有更有效的方法(只使用我已经编写的模块,我们不能使用其他任何东西)答案 0 :(得分:2)
首先,您需要读取第一个输入文件。所以你需要打开()你读取的第一个输入文件。 要添加换行符,请修改while循环以检查文件(在打开()之后)是否在末尾有一个新行,如果没有,则将其放在那里。
为了实现无替换选项,您需要一些方法来检查您是否已经读过一行。要分割您按行阅读的文件,只需使用
即可input.split('\n')
你的randline构造函数正在传递文件的内容,所以它在构造函数中尝试做的事情没有意义。
很抱歉,如果这个答案似乎没有意义;我已经完成并试图指出你需要解决的不同事情。我无法对东西发表评论,因为我没有声誉,所以我必须回答:。如果这有帮助,请告诉我!
要做到不做替换,我会创建一个字典,将字符串作为键,并将int作为值。循环遍历所有输入文本,每次看到一行时,将其添加到字典中并递增关联的整数。然后,当您调用chooseline时,请检查以确保通过选择随机行获得的字符串中的值大于0.如果是,则递减关联值,然后返回您选择的字符串。否则,选择一个新行。
回复编辑2.0: 你可以做到这一点。然后,每次选择随机行时,都会从列表中删除它。我认为那会有用。