当从python

时间:2018-01-08 13:49:06

标签: python python-3.x

背景:我有很多音乐。我也倾向于一遍又一遍地听同一张专辑。最终,这让我感到恼火,我决定每天都要听另一个人。看到我的收藏中只有100多张专辑,并且看到我知道一点点编程,我想我会编写一个脚本来帮助自己。

现在,请记住,我是一个知道自己知之甚少的学生。我所知道的大部分内容都来自一本Python书(虽然它是一个让初学者能够开始的好书)和Python文档。

另外,我正在运行Python 3.6并使用Cygwin,所以我确实有* nix命令可用。

问题在于以下方法(编辑9:43 EST - 建议"如果文件中的行"实现添加;新行加星标):

def choose_album(library_file, day_file):
    albums = []
    for line in fileinput.input(library_file):
        albums.append(line)
    fileinput.close() #**
    check_file = io.open(day_file) #**
    album_chosen = False #**
    while album_chosen == False:
        choice = random.randrange(0, len(albums))
        print("Searching for " + albums[choice] + ".")
        for line in check_file: #**
            if albums[choice] in line: #**
                break #**
        if albums[choice] not in check_file: #**
            album_chosen = True #**
    print(albums[choice])
    return albums[choice]

其中library_file是一个文本文件,其中包含我在Spotify上购买或收听的所有相册,而day_file是我当天的专辑#34;文件,每行包含当天的日期和专辑。 while循环曾经是

if albums[choice] in line:
    break

然后脚本会继续将其写入day_file。 它工作正常,但问题是if albums[choice] in line行有时会返回漏报,给我一张我已经听过的专辑,这意味着我必须回到我的文件中,删除冗余相册,然后再次运行脚本。

更新(美国东部时间9:43)根据我对已编辑代码的测试运行,这至少不会吐出大量文本。是否有可能再次给我重复?

更新(美国东部时间12点02分) - 删除因建议而无关的输出。

1 个答案:

答案 0 :(得分:0)

您正在阅读线条而不修剪最终换行符:

i+1

你可能意味着写的内容可能与

一致
for line in fileinput.input(library_file):
    albums.append(line)  ##### BUG

换行导致 albums.append(line.rstrip('\n')) 打印出每一行。令我惊讶的是,在作为活跃的Unix用户25年后,我发现至少某些版本的grep会导致

grep

打印出 grep 'String which ends with newline ' filename 中的每一行,显然是因为它认为这相当于

filename

显然,作为正则表达式的空字符串匹配每个可能的输入。

grep -e 'String which ends with newline' -e '' filename` 切换到grep会删除此症状,并且实际上恰好可以正常工作,因为您还没有从您从其他文件中读取的行修剪换行符,并且您专门查找位于线的末端;所以if albums[choice] in line实际上会返回"foo\n" in "datestamp foo\n"。但是,这似乎与您的预期相反(例如,您正在打印字符串后跟一个完整的停止,它在嵌入的换行符之后落在输出中的一行上)所以这可能仍然是(次要的)你的代码中的错误。