2016-10-11 26 views
0

我一直在研究一个问题,我意识到我可能接近错误的方式,但现在感到困惑和出于想法。我所做的任何研究都让我更加困惑,因此我来求助。将嵌套列表导入文本文件

我有一个嵌套列表:

[ '#名称姓', '年龄', '类', '分数', '\ n'],[ '名', '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', '']]

我想使它所以这个列表导入到正确的布局的文本文件。为此,我把琴弦压平,然后与','一起加入。

的问题,这是因为“\ 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

最简单的方法很可能是从子列表中删除换行符你让他们,打印每个子列表一次一个。这看起来像这样:

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()

1

我不知道该列表是一个在您的文章(子表?),但是当你将其压平,就放弃“\ n”的字符串:

flattened = [x for x in sublist if x != ["\n"]] 
+0

子列表只是一个变量名。你上面发布的东西只是抛出了语法错误,因为我相信没有Python术语。 – Chris

+0

将我的命令中的子列表替换为您发布的嵌套列表的名称。无论名字是什么,循环遍历你的嵌套列表,并且忽略只是裸体新行的条目完全符合你的要求。 –

+0

http://prntscr.com/csn77e – Chris

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) 
+0

问题是,嵌套列表正在从文件导入,这似乎是想建立一个字符串的工作。 – Chris

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模块可以很好地处理混合数据类型。

+0

这里的问题是,嵌套列表本身正在从最初的文本文件导入,进行编辑,然后放回去。 – Chris

+0

因此数据不能在文件中最初 – Chris

+0

的数据可以从一个文件或其他源。我只将这些数据作为示例。 –