我有以下代码,我只想让它将列表写入文件。它会这样做,但每次都有一个空行,这会导致每次迭代出现问题!
with open("films.txt", mode='r') as f:
allfilms=[]
reader = csv.reader(f)
for row in reader:
#create a list again which reads in and stores all films in the file
allfilms.append(row)
print(allfilms)
with open("films.txt","w") as f:
writer=csv.writer(f)
writer.writerows(allfilms)
输出是: 0,类型,标题,评分,喜欢
1,Sci-Fi,Out of the Silent Planet, PG, 0
2,Sci-Fi,Solaris, PG,0
3,Sci-Fi,Star Trek, PG, 0
4,Sci-Fi,Cosmos, PG, 0
如上所述,保存列表时我不想要空白行。此外,我对更优雅或更好的方式做同样的事情感兴趣。我希望将文件读入列表,然后在格式化方面与文件中存储的内容完全相同地写回文件。
提前致谢
答案 0 :(得分:1)
编辑:当我写这个答案时,我误解了csv模块如何给出输出,但由于降档的有用评论,我没有删除它。请参阅我最近更准确的答案。
降档在评论中回答了这个问题,但我会尝试详细说明为什么会发生这种情况。
当您从csv阅读器中读取每一行时,它会为您提供整行,其中包含最后一行的换行符(\n
)。您的问题源于这样一个事实:当您写入文件时,write函数会将其自己的换行符添加到字符串的末尾。幸运的是,有两种非常简单的方法可以从csv阅读器返回的行末尾删除换行符。
一种方法是使用字符串的.strip()
方法,它以字符串的形式接收一些字符作为输入,并从字符串的末尾开始尽可能多的字符。使用此方法可以替换:
allfilms.append(row)
与
allfilms.append(row.strip("\n"))
另一种方法是使用字符串切片并切掉字符串的最后一个字符。我不建议你使用字符串切片,因为你不太清楚自己在做什么,但如果你愿意,你会替换:
allfilms.append(row)
与
allfilms.append(row[:-1])
row[:-1]
将返回排除最后一个字符的行,丢弃换行符。
希望这有助于你!
答案 1 :(得分:1)
我认为您的问题的根源在于,当您打开films.txt
时,您忘记将newline=''
参数包含在docs中,以便使用。这意味着您的代码变为:
with open("films.txt", mode='r', newline='') as f:
和
with open("films.txt", mode='w', newline='') as f: