背景:我有很多音乐。我也倾向于一遍又一遍地听同一张专辑。最终,这让我感到恼火,我决定每天都要听另一个人。看到我的收藏中只有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分) - 删除因建议而无关的输出。
答案 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"
。但是,这似乎与您的预期相反(例如,您正在打印字符串后跟一个完整的停止,它在嵌入的换行符之后落在输出中的一行上)所以这可能仍然是(次要的)你的代码中的错误。