在文件中写入嵌入列表

2021-05-16 08:14:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有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条回答
网友
1楼 ·

这可能是个坏主意,因为你下周会回来问,“所以我有一个奇怪格式的文件,但我不知道如何解析它……”正如史蒂文·伦巴尔斯基在一篇评论中所建议的,你几乎肯定想做的是要么把它写成一个大的JSON文本,要么把它写成一个CSV文件。其中任何一个都是琐碎的编写,就像琐碎的解析,也是人类可读和可编辑的。你知道吗

但是如果你真的想要这种格式,你只需要精确地描述它,然后它应该很容易变成代码。你知道吗

没有一种格式会像json.dump(x, fo)csv.writer(fo).writerows(x)那么简单,但这是因为广泛使用的格式都有很好的库,使它们易于编写,而特殊格式则不然。你知道吗

但不会那么难。你知道吗

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

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

另外,您的一些行现在以最后的,结束,但其他行则没有。我不知道这个规则是什么,不过,如果你能解释的话,我相信你能编出来。你知道吗

网友
2楼 ·

下面是一个使用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'
]
网友
3楼 ·

您需要每个列表的字符串表示形式减去由逗号+换行符连接的括号,所有内容都用括号括起来。你知道吗

一行就行了(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)))

相关问题