我已经习惯了 print >>f, "hi there"
但是,似乎print >>
已经弃用了。推荐使用哪种方法进行上述操作?
更新:关于...的所有这些答案,"\n"
这是通用的还是特定于Unix的?IE,我应该"\r\n"
在Windows上运行吗?
我已经习惯了 print >>f, "hi there"
但是,似乎print >>
已经弃用了。推荐使用哪种方法进行上述操作?
更新:关于...的所有这些答案,"\n"
这是通用的还是特定于Unix的?IE,我应该"\r\n"
在Windows上运行吗?
Answers:
这应该很简单:
with open('somefile.txt', 'a') as the_file:
the_file.write('Hello\n')
从文档:
os.linesep
写入以文本模式打开的文件时(默认),请勿用作行终止符;在所有平台上都使用一个'\ n'代替。
一些有用的读物:
with
声明open()
os
(特别是os.linesep
)with
是记住关闭文件的更安全的方法。
the_file.close()
吗?
您应该使用print()
Python 2.6+以上版本提供的功能
from __future__ import print_function # Only needed for Python 2
print("hi there", file=f)
对于Python 3,您不需要import
,因为该 print()
功能是默认设置。
替代方法是使用:
f = open('myfile', 'w')
f.write('hi there\n') # python will convert \n to os.linesep
f.close() # you can omit in most cases as the destructor will call it
引用Python文档中有关换行符的内容:
在输出中,如果换行符为None,则所有
'\n'
写入的字符都会转换为系统默认的行分隔符os.linesep
。如果newline是''
,则不会进行翻译。如果换行符是其他任何合法值,'\n'
则将写入的所有字符转换为给定的字符串。
\n
”,将需要newline =“”,否则将\r\r\n
在Windows上运行。根本没有理由对os.linesep感到困惑。
\r\n
包含\n
被翻译成os.linesep是\r\n
这样最终的结果是\r\r\n
。
open('myfile','a')
不是open('myfile','w')
吗?
在Python文档建议是这样的:
with open('file_to_write', 'w') as f:
f.write('file contents\n')
所以这就是我通常的方式:)
来自docs.python.org的声明:
在处理文件对象时,最好使用'with'关键字。这样做的好处是,即使在执行过程中引发了异常,文件在其套件完成后也将正确关闭。它也比编写等效的try-finally块短得多。
with
内部嵌套在循环中时,我不喜欢这种方式。这使我在循环中不断打开和关闭文件。也许我在这里错过了一些东西,或者这在特定情况下确实是不利的?
关于os.linesep:
这是Windows上未经编辑的Python 2.7.1解释器的确切会话:
Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.linesep
'\r\n'
>>> f = open('myfile','w')
>>> f.write('hi there\n')
>>> f.write('hi there' + os.linesep) # same result as previous line ?????????
>>> f.close()
>>> open('myfile', 'rb').read()
'hi there\r\nhi there\r\r\n'
>>>
在Windows上:
正如预期的那样,os.linesep确实不产生相同的结果一样'\n'
。它不可能产生相同的结果。'hi there' + os.linesep
等同于'hi there\r\n'
,不等同于'hi there\n'
。
就是这么简单:使用\n
它将自动转换为os.linesep。自从将Python首次移植到Windows以来,事情就变得如此简单。
在非Windows系统上使用os.linesep是没有意义的,并且在Windows上会产生错误的结果。
请勿使用os.linesep!
os.linesep
在Windows中以文本模式显式使用,则结果\r\r\n
是错误的。“ Windows使用...”是没有意义的。C运行时库(以及Python)在文本模式下转换\n
为\r\n
on输出。其他软件的行为可能有所不同。\n
在文本模式下阅读时,并非所有Windows上运行的软件都将孤行识别为行分隔符。Python确实如此。微软的记事本文本编辑器没有。
\r
……
os.linesep
是 “错误的”。就像Department of Redundancy Department
。是的,你可以做到。不,你不想。
with
超出范围时,此处文件将关闭。
open(..., 'a')
甚至'at'
。
如果您要写入大量数据,并且速度是一个问题,那么您可能应该考虑一下f.write(...)
。我进行了快速的速度比较,它比print(..., file=f)
执行大量写操作时要快得多。
import time
start = start = time.time()
with open("test.txt", 'w') as f:
for i in range(10000000):
# print('This is a speed test', file=f)
# f.write('This is a speed test\n')
end = time.time()
print(end - start)
在write
我的机器上,平均完成print
时间为2.45秒,而耗时则为(9.76s)的4倍。话虽这么说,在大多数现实情况下这都不是问题。
如果您选择使用,print(..., file=f)
您可能会发现您可能会不希望取消换行符,或将其替换为其他内容。这可以通过设置可选end
参数来完成,例如;
with open("test", 'w') as f:
print('Foo1,', file=f, end='')
print('Foo2,', file=f, end='')
print('Foo3', file=f)
我建议您使用哪种选择,with
因为它使代码更易于阅读。
更新:这种性能差异是由以下事实解释的:write
高度缓冲并在实际对磁盘进行任何写操作之前返回(请参阅此答案),而print
(可能)使用行缓冲。一个简单的测试就是检查长写的性能,因为行缓冲的缺点(在速度方面)不太明显。
start = start = time.time()
long_line = 'This is a speed test' * 100
with open("test.txt", 'w') as f:
for i in range(1000000):
# print(long_line, file=f)
# f.write(long_line + '\n')
end = time.time()
print(end - start, "s")
现在,性能差异变得不那么明显了,的平均时间为2.20s write
和3.10s print
。如果您需要连接一串字符串来获得这种良好的性能,那么性能会受到影响,因此使用案例中print
效率更高的情况很少见。
当您说Line时,它表示一些序列化的字符,它们以'\ n'字符结尾。行应该在最后一点,所以我们应该在每行的末尾考虑'\ n'。这是解决方案:
with open('YOURFILE.txt', 'a') as the_file:
the_file.write("Hello")
在追加模式下,每次写入光标后移至新行,如果要使用w
模式,则应\n
在write()
函数末尾添加字符:
the_file.write("Hello\n")
可以使用烧瓶中的文件写入文本:
filehandle = open("text.txt", "w")
filebuffer = ["hi","welcome","yes yes welcome"]
filehandle.writelines(filebuffer)
filehandle.close()
您也可以尝试 filewriter
pip install filewriter
from filewriter import Writer
Writer(filename='my_file', ext='txt') << ["row 1 hi there", "row 2"]
写入 my_file.txt
接受可迭代对象或带有__str__
支持的对象。
当我需要写很多新行时,我定义一个使用print
函数的lambda :
out = open(file_name, 'w')
fwl = lambda *x, **y: print(*x, **y, file=out) # FileWriteLine
fwl('Hi')
这种方法的好处是可以利用该功能可用的所有print
功能。
更新:正如Georgy在评论部分中提到的那样,可以通过以下partial
功能进一步改善此想法:
from functools import partial
fwl = partial(print, file=out)
恕我直言,这是一种功能更强,含糊不清的方法。
from functools import partial; fwl = partial(print, file=out)
。