我有以下代码:
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
是什么数据类型?
答案 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://docs.python.org/2/library/pickle.html和https://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
,但无论如何这就是你写出一行文字的方式。