首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在文件中写入嵌入式列表

在文件中写入嵌入式列表
EN

Stack Overflow用户
提问于 2018-08-16 20:36:40
回答 3查看 61关注 0票数 1

我有python代码,它生成以下输出,

代码语言:javascript
复制
[

['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']

]

我把这个写在档案里

代码语言:javascript
复制
fo=open("result.txt","w")
print ("Name of file: ",fo.name)
for item in x :
    fo.write("%s\n"% item)
fo.close()

清单如上文所述。但是我希望文件中的输出是

代码语言:javascript
复制
 [

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

    ]

这意味着每个输出行都由一个新的line.Is隔开,那里有一个函数调用相同的或更好的方法,而不是我所写的,可以得到结果。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-16 20:52:25

下面是一个使用str.join()的实现

代码语言:javascript
复制
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')

输出:

代码语言:javascript
复制
$> 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'
]
票数 0
EN

Stack Overflow用户

发布于 2018-08-16 20:53:41

这可能是个坏主意,因为你下周就会回来问,“所以我有这个奇怪格式的文件,但我不知道如何解析它…”正如在一条评论中所建议的那样,您几乎肯定希望将它写成一个大JSON文本,或者将它写成一个CSV文件。其中任何一个都是琐碎的编写,就像解析一样琐碎,也是人类可读的和-editable。

但是如果你真的想要这种格式,你只需要精确地计算出如何描述它,然后它应该很容易转换成代码。

所有这些都不会像json.dump(x, fo)csv.writer(fo).writerows(x)那样简单,但这是因为广泛有用的格式有很好的库来使它们易于编写,而特性格式则不然。

但也没那么难。

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

代码语言:javascript
复制
fo.write(str(item).strip('[]') + "\n")

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

代码语言:javascript
复制
fo.write(str(item)[1:-1] + "\n")

这一规则也非常相似,但却微妙地不同:

代码语言:javascript
复制
fo.write(', '.join(map(repr, item)) + "\n")

你想要哪一个?我不知道,但你应该知道。

当然,您还在所有行之前都请求了[,在所有行之后都请求了],因此您还必须显式地添加以下内容:

代码语言:javascript
复制
fo.write('[\n')
for item in x :
    # whichever rule you wanted from above
fo.write(']\n')

从您的编辑来看,您似乎需要一些不寻常的缩进和空行,所以您也必须显式地这样做:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-08-16 20:48:01

您需要每个列表的字符串表示形式减去由comma+linefeed连接的括号,所有这些都封装在括号中。

有一行可以这样做(result是列表列表):

代码语言:javascript
复制
print("[\n{}\n]".format(",\n".join([str(x).strip('[]') for x in result])))

指纹:

代码语言:javascript
复制
[
'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,它将所有列表与comma+linefeed连接起来
  • "[\n{}\n]".format,它将连接的结果封装到brackets+linefeeds中(写入文件,显然用f.write替换printf是文件句柄)

这个解决方案不支持每一行的“缩进”,但是如果通过",\n ".join更改",\n ".join并弥补第一个元素,则非常容易:

代码语言:javascript
复制
print("[\n   {}\n]".format(",\n   ".join(str(x).strip('[]') for x in result)))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51884992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档