在文件中写入嵌入式列表

时间:2018-08-16 20:36:41

标签: python list file

我有python代码正在产生以下输出,

[

['3', 'cs2313', 'someone', 'cs231', 'IT networks', 'cs232', 'IT Workshop', 'cs233', 'IT programming'], 
['5', 'ec3325', 'someone', 'ec301', 'Maths2', 'ec302', 'Theory of Circuits', 'ec303', 'PCB design'], 
['7', 'cs4890', 'someone', 'cs401', 'Game Theory', 'cs402', 'Systems Programming', 'cs403', 'Automata'],
['1', 'ec1008', 'someone', 'ec101', 'Digitization', 'ec102', 'Analog cicuit design', 'ec103', 'IP Telephony'], 
['3', 'cs2002', 'someone', 'cs231', 'IT networks', 'cs232', 'IT Workshop', 'cs233', 'IT programming'], 
['3', 'cs2009', 'someone', 'cs231', 'IT networks', 'cs232', 'IT Workshop', 'cs233', 'IT programming']

]

我正在文件

中编写此文件
fo=open("result.txt","w")
print ("Name of file: ",fo.name)
for item in x :
    fo.write("%s\n"% item)
fo.close()

列表如上所述。 但是我想要的文件输出是

 [

    '3', 'cs2313', 'someone', 'cs231', 'IT networks', 'cs232', 'IT Workshop', 'cs233', 'IT programming', 
    '5', 'ec3325', 'someone', 'ec301', 'Maths2', 'ec302', 'Theory of Circuits', 'ec303', 'PCB design', 
    '7', 'cs4890', 'someone', 'cs401', 'Game Theory', 'cs402', 'Systems Programming', 'cs403', 'Automata',
    '1', 'ec1008', 'someone', 'ec101', 'Digitization', 'ec102', 'Analog cicuit design', 'ec103', 'IP Telephony', 
    '3', 'cs2002', 'someone', 'cs231', 'IT networks', 'cs232', 'IT Workshop', 'cs233', 'IT programming', 
    '3', 'cs2009', 'someone', 'cs231', 'IT networks', 'cs232', 'IT Workshop', 'cs233', 'IT programming'

    ]

表示每条输出行都用换行符隔开。是否有函数以与我编写的方法相同或更好的方法来获得结果。

3 个答案:

答案 0 :(得分:2)

这可能是个坏主意,因为下周您将回到这里,问:“所以我有这个奇怪格式的文件,但我不知道如何解析它……” Rumbalski在评论中建议,您几乎肯定想要做的是将其编写为一个大JSON文本,或将其编写为CSV文件。这些都很难编写,就像解析一样简单,并且易于阅读和编辑。

但是,如果您真的想要这种格式,只需要弄清楚如何描述它,然后就可以轻松地将其转换为代码。

没有一个会像json.dump(x, fo)csv.writer(fo).writerows(x)那样简单,但这是因为广泛使用的格式具有易于编写的漂亮库,而特有格式则没有。

>

但这并不难。。

例如,我对您的规则的第一个猜测是,您想要的只是列表的代表,但没有括号:

fo.write(str(item).strip('[]') + "\n")

当然,这个非常相似的规则也会为您的示例提供相同的输出,但是如果您有三层嵌套的列表,则它会有所不同:

fo.write(str(item)[1:-1] + "\n")

此规则也非常相似,但有细微差别:

fo.write(', '.join(map(repr, item)) + "\n")

您想要哪个?我不知道,但大概你知道。


当然,您还要求在所有行之前输入[,并在所有行之后要求],因此还必须明确添加:

fo.write('[\n')
for item in x :
    # whichever rule you wanted from above
fo.write(']\n')

从您的编辑看来,您似乎想要一些不寻常的缩进和空白行,因此您也必须明确地做到这一点:

fo.write(' [\n\n')
for item in x:
    # whichever rule you wanted from above
    # but with a '    ' prefixed to the string
fo.write('\n .   ]\n')

此外,您的某些行现在以最后一个,结尾,而其他行则没有。我不确定这是什么规则,但是,再次,如果您可以解释它,我肯定您可以编写它。

答案 1 :(得分:1)

您希望每个列表的字符串表示都减去用逗号+换行符连接的方括号,并用方括号括起来。

一行完成(result是您的列表列表):

print("[\n{}\n]".format(",\n".join([str(x).strip('[]') for x in result])))

打印:

[
'3', 'cs2313', 'someone', 'cs231', 'IT networks', 'cs232', 'IT Workshop', 'cs233', 'IT programming',
'5', 'ec3325', 'someone', 'ec301', 'Maths2', 'ec302', 'Theory of Circuits', 'ec303', 'PCB design',
'7', 'cs4890', 'someone', 'cs401', 'Game Theory', 'cs402', 'Systems Programming', 'cs403', 'Automata',
'1', 'ec1008', 'someone', 'ec101', 'Digitization', 'ec102', 'Analog cicuit design', 'ec103', 'IP Telephony',
'3', 'cs2002', 'someone', 'cs231', 'IT networks', 'cs232', 'IT Workshop', 'cs233', 'IT programming',
'3', 'cs2009', 'someone', 'cs231', 'IT networks', 'cs232', 'IT Workshop', 'cs233', 'IT programming'
]

关键部分是:

  • str(x).strip('[]'),用于创建/保留每个列表的表示形式(不包括方括号)
  • ",\n".join,其中所有列表都用逗号+换行符
  • "[\n{}\n]".format,将合并结果包装在方括号和换行符中 (要写入文件,显然用print替换f.writef是文件句柄)

此解决方案不支持每行的“缩进”,但是如果您将",\n".join更改为",\n ".join,并弥补第一个元素,则很简单:

print("[\n   {}\n]".format(",\n   ".join(str(x).strip('[]') for x in result)))

答案 2 :(得分:0)

这是使用str.join()的实现:

my_list = [

['3', 'cs2313', 'someone', 'cs231', 'IT networks', 'cs232', 'IT Workshop', 'cs233', 'IT programming'], 
['5', 'ec3325', 'someone', 'ec301', 'Maths2', 'ec302', 'Theory of Circuits', 'ec303', 'PCB design'], 
['7', 'cs4890', 'someone', 'cs401', 'Game Theory', 'cs402', 'Systems Programming', 'cs403', 'Automata'],
['1', 'ec1008', 'someone', 'ec101', 'Digitization', 'ec102', 'Analog cicuit design', 'ec103', 'IP Telephony'], 
['3', 'cs2002', 'someone', 'cs231', 'IT networks', 'cs232', 'IT Workshop', 'cs233', 'IT programming'], 
['3', 'cs2009', 'someone', 'cs231', 'IT networks', 'cs232', 'IT Workshop', 'cs233', 'IT programming']

]

with open('output_file', 'a+') as f_data:
    f_data.write('[\n')
    for elm in my_list:
        # Maybe you don't need to check if the elm is a list ?
        if isinstance(elm, list):
            f_data.write(', '.join("'{}'".format(k) for k in elm) + '\n')
    f_data.write(']\n')

输出:

$> cat output_file

[
'3', 'cs2313', 'someone', 'cs231', 'IT networks', 'cs232', 'IT Workshop', 'cs233', 'IT programming'
'5', 'ec3325', 'someone', 'ec301', 'Maths2', 'ec302', 'Theory of Circuits', 'ec303', 'PCB design'
'7', 'cs4890', 'someone', 'cs401', 'Game Theory', 'cs402', 'Systems Programming', 'cs403', 'Automata'
'1', 'ec1008', 'someone', 'ec101', 'Digitization', 'ec102', 'Analog cicuit design', 'ec103', 'IP Telephony'
'3', 'cs2002', 'someone', 'cs231', 'IT networks', 'cs232', 'IT Workshop', 'cs233', 'IT programming'
'3', 'cs2009', 'someone', 'cs231', 'IT networks', 'cs232', 'IT Workshop', 'cs233', 'IT programming'
]