将对象写入python文件

时间:2015-05-31 14:32:52

标签: python file-io

我有以下代码:

 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是什么数据类型?

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

首先,不是单独打开和关闭文件,而是可以使用自动执行作业的with statement和错误,因为它说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))

此外,作为文件对象是迭代器的更加pythonic方式,您可以在以下代码中执行此操作,并通过调用其next方法获取第一行并将其余部分传递给join函数:

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

答案 2 :(得分:0)

您无法将对象“写入”文件。而是使用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]中的任何内容都是列表推导,而列表推导会列出列表。 要查看任何对象的类型,只需使用 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

答案 3 :(得分:0)

write函数只处理字符或字节。要编写任意对象,请使用python的pickle库。使用pickle.dump()撰写,然后使用pickle.load()阅读。

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

for line in vals:
    ea.write(line)

ea.close()

您现在编写的文件看起来像abc.txt,但每行的第一行和第一个字符已被删除。 (你在构建vals时删除了那些。)

不知怎的,我怀疑这是你的意图,因为你选择将它命名为abc_format.txt,但无论如何这就是你写出一行文字的方式。