将对象写入 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

首先,您可以使用 with statement 代替单独打开和关闭文件来完成 automatically.and 关于错误的工作,因为它说 write 方法只接受字符缓冲区对象,因此您需要将列表转换为字符串。

例如,您可以使用 join 函数将可迭代对象中的项目与特定分隔符和 return 串联字符串连接起来。

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

您不能 "write" 对象到文件。相反,使用 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.html and https://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,但无论如何这就是您写出文本行列表的方式。

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