我一直在研究一个问题,我意识到我可能接近错误的方式,但现在我感到困惑和想法。我所做的任何研究都让我更加困惑,因此我来寻求帮助。
我有一个嵌套列表:
[['#姓名姓氏','年龄','课程','分数',' \ n&# 39;],['名称',' 9',' B', ' N / A',' \ n'],[' name1',' 9',' B', ' N / A',' \ n'],[' name2',' 8',' B', ' N / A',' \ n'],[' name3',' 9',' B', ' N / A',' \ n'],[' name4',' 8',' B', ' N / A','']]
我正在努力使这个列表以正确的布局导入到文本文件中。为此,我将绳子弄平,然后将其与“#”,“#39;”连接在一起。
这个问题是因为' \ n'正在存储在列表本身中,它在此之后添加一个逗号,最终转为:
姓名姓,年龄,班级,分数,
名称,9,B,N / A,
Name1,9,B,N / A,
Name2,8,B,N / A,
Name3,9,B,N / A,
Name4,8,B,N / A,
成:
姓名姓,年龄,班级,分数,
,
,名称,9,B,N / A,
,Name1,9,B,N / A,
,Name2,8,B,N / A,
,Name3,9,B,N / A,
,Name4,8,B,N / A,
如果我从代码中删除了\ n,由于没有新行,文本文件中的格式都是错误的。
有没有更好的方法来解决这个问题,还是可以快速解决我看不到的所有问题?
谢谢!
我的参考代码:
def scorestore(score):
user[accountLocation][3] = score
file = ("classdata",schclass,".txt")
file = "".join(file)
flattened = [val for sublist in user for val in sublist]
flatstring = ','.join(str(v) for v in flattened)
accountlist = open(file,"w")
accountlist.write(flatstring)
accountlist.close()
答案 0 :(得分:1)
我不确定哪个列表是您帖子中的列表(子列表?)但是当你展平它时,只需丢弃“\ n”字符串:
flattened = [x for x in sublist if x != ["\n"]]
答案 1 :(得分:0)
最简单的方法可能是在获取子列表时从子列表中删除换行符,一次打印一个子列表。这看起来像是:
for sublist in users:
print(",".join(val for val in sublist if not val.isspace()), file=accountlist)
然而,这将在列表中的0上失败。我不确定你是否打算处理这个问题,或者它是否是无关紧要的。如果您确实需要处理,那么您必须将生成器表达式更改为str(val) for val in sublist if not str(val).isspace()
。
答案 2 :(得分:0)
而不是制作一个字符串,如何写行。使用这样的东西:
list_of_list = [[...]]
lines = [','.join(line).strip() for line in list_of_list]
lines = [line for line in lines if line]
open(file,'w').writelines(lines)
答案 3 :(得分:0)
使用csv
模块更轻松:
import csv
data = [
['# Name Surname', 'Age', 'Class', 'Score','\n'],
['\n'],
['Name', '9', 'B', 'N/A','\n'],
['Name1', '9', 'B', 'N/A','\n'],
['Name2', '8', 'B', 'N/A','\n'],
['Name3', '9', 'B', 'N/A','\n'],
['Name4', '8', 'B', 0]
]
# Remove all the ending new lines
data = [row[:-1] if row[-1] == '\n' else row for row in data]
# Write to file
with open('write_sublists.csv', 'wb') as f:
writer = csv.writer(f)
writer.writerows(data)
您的数据不规则:某行包含结尾的新行,某行不包含。但是某些行包含所有字符串,而某些行包含混合数据类型。第一步是通过删除所有结束的新行来规范化它们。 csv
模块可以很好地处理混合数据类型。