将对象写入 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://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()
我有以下代码:
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://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()