如何从多列表生成≤35字符短语并解决CSV写入异常
问题描述
- 作为编程新手开发简单短语生成器,已完成基础功能,需解决两个问题:
- 仅生成字符数≤35且语句完整的短语
- 修复CSV写入时,生成的短语分散到多行多列的异常
现有代码
短语生成代码
import csv from random import randint other = ["leave","place","set","rest","prop on","lean","lay","stow","sit","set"] names=["front","back"] verbs=["door,", "side,","porch,","steps","stairs","stairway","staircase","entry","stoop"] nouns=["Thanks a ton", "Thanks a million", "forever indebted", "please thanks","super great","appreciated", "thank you","deep gratitude","means the world","TYSM","Congrats Champ","Keep on going","Never quit","Believe 4ever" ,"you did it","always believe","love persists","frenz forever","pat on back","kudos bro","mad thanks","best ever","gift for her", "gift for cousin","u deserve it","keep it real","love u girl","u make my wrld","thankful","best wishes","stay warm","stay cool","2 my bestie",] while True: phrase_amount = input("How many phrases would you like to create?") for i in range(int(phrase_amount)): print((other[randint(0,len(other)-1)]+" "+names[randint(0,len(names)-1)]+" "+verbs[randint(0,len(verbs)-1)]+" "+nouns[randint(0,len(nouns)-1)]))
CSV写入代码
csvname = f"{phrase_amount}" with open (f'PhrasesbyTrill{csvname}.csv','w', newline='') as file: myfile = csv.writer(file) myfile.writerow(["Phrases"]) for i in range(int(phrase_amount)): myfile.writerow((other[randint(0,len(other)-1)]+" "+names[randint(0,len(names)-1)]+" "+verbs[randint(0,len(verbs)-1)]+" "+nouns[randint(0,len(nouns)-1)]))
解决方案
1. 修复CSV短语分散问题
csv.writer.writerow() 接收可迭代对象,直接传入字符串会被拆成单个字符,导致每个字符占一列。解决方法是把生成的短语放到列表中传入:
修改CSV写入代码的循环部分:
for i in range(int(phrase_amount)): # 先拼接生成完整短语 phrase = f"{other[randint(0, len(other)-1)]} {names[randint(0, len(names)-1)]} {verbs[randint(0, len(verbs)-1)]} {nouns[randint(0, len(nouns)-1)]}" # 将短语放入列表后写入,确保整行只存一个短语 myfile.writerow([phrase])
2. 生成符合字符数要求的短语
随机组合的短语可能超过35字符,需循环生成直到满足长度条件。可以封装一个函数来生成有效短语:
def generate_valid_phrase(): while True: phrase = f"{other[randint(0, len(other)-1)]} {names[randint(0, len(names)-1)]} {verbs[randint(0, len(verbs)-1)]} {nouns[randint(0, len(nouns)-1)]}" # 检查字符数≤35,同时可根据需求过滤不通顺的组合(比如verbs里的结尾逗号) if len(phrase) <= 35: return phrase
替换原生成逻辑
修改短语生成代码的打印部分:
for i in range(int(phrase_amount)): valid_phrase = generate_valid_phrase() print(valid_phrase)
修改CSV写入代码的循环部分:
for i in range(int(phrase_amount)): valid_phrase = generate_valid_phrase() myfile.writerow([valid_phrase])
额外提示:verbs列表中部分元素带结尾逗号(如"door,"),可能影响语句通顺,可根据需求去掉逗号。
内容的提问来源于stack exchange,提问作者GinaD
相关产品推荐
相关产品推荐

