繁体   English   中英

将对象写入python文件

[英]Writing an object to python file

我有以下代码:

 matrix_file = open("abc.txt", "rU")
 matrix = matrix_file.readlines()
 keys = matrix[0]
 vals = [line[1:] for line in matrix[1:]]
 ea=open("abc_format.txt",'w')
 ea.seek(0)
 ea.write(vals)
 ea.close()

但是我收到以下错误:

TypeError: expected a character buffer object

如何缓冲输出,变量vals是什么数据类型?

vals是一个列表。 如果要将字符串列表而不是单个字符串写入文件,请使用writelines

 ea=open("abc_format.txt",'w')
 ea.seek(0)
 ea.writelines(vals)
 ea.close()

请注意,这不会为您插入换行符(尽管在特定情况下,字符串已经以换行符结尾,如注释中所指出)。 如果您需要添加换行符,可以执行以下示例:

 ea=open("abc_format.txt",'w')
 ea.seek(0)
 ea.writelines([line+'\n' for line in vals])
 ea.close()

首先,与其单独打开和关闭文件,不如使用可自动执行工作的语句 。关于错误,因为它说write方法仅接受字符缓冲区对象,因此您需要将列表转换为字符串。

例如,您可以使用join函数,该函数使用特定的定界符将可迭代对象中的项目连接在一起,并返回一个串联字符串。

with open("abc.txt", "rU") as f,open("abc_format.txt",'w') as out:
   matrix = f.readlines()
   keys = matrix[0]
   vals = [line[1:] for line in matrix[1:]]
   out.write('\n'.join(vals))

另外,作为文件对象是迭代器的一种更加Python化的方式,您可以在以下代码中进行操作,并通过调用其next方法获得第一行,并将其余的传递给join函数:

with open("abc.txt", "rU") as f,open("abc_format.txt",'w') as out:
   matrix = next(f)
   out.write('\n'.join(f))

您不能将对象“写入”文件。 而是使用pickle模块:

matrix_file = open("abc.txt", "rU")
matrix = matrix_file.readlines()
keys = matrix[0]
vals = [line[1:] for line in matrix[1:]]
#pickling begins!
import pickle
f = open("abc_format.txt")
pickle.dump(vals, f) #call with (object, file)
f.close()

然后像这样阅读:

import pickle
f = open("abc_format.txt")
vals = pickle.load(f) #exactly the same list
f.close()

您可以使用任何类型的对象(您自己的对象或内置对象)执行此操作。 您只能将字符串和字节写入文件,python的open()函数就像打开记事本一样将其打开。

要回答您的第一个问题, vals是一个列表,因为[operation(i) for i in iterated_over]任何内容[operation(i) for i in iterated_over]都是列表理解,而列表理解会生成列表。 要查看任何对象的类型是什么,只需使用 type()函数即可; 例如type([1,4,3])

示例: https//repl.it/qKI/3

此处的文档: https : //docs.python.org/2/library/pickle.htmlhttps://docs.python.org/2/tutorial/datastructures.html#list-comprehensions

write功能将仅处理字符或字节。 要编写任意对象,请使用python的pickle库。 与写pickle.dump()与读回pickle.load()

但是,如果您真正想要的是以与输入相同的格式编写内容,则必须自己写出矩阵值和换行符。

for line in vals:
    ea.write(line)

ea.close()

现在,您已编写了一个类似于abc.txt的文件,但已删除了每一行的第一行和第一个字符。 (您在构造vals时删除了它们。)

由于您选择将其命名为abc_format.txt ,因此abc_format.txt我怀疑这是您的意图,但是无论如何,这就是您编写文本行列表的方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM