Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 打印到UTF-8编码文件,是否使用平台相关的换行符?_Python_Text_Utf 8_Newline_Codec - Fatal编程技术网

Python 打印到UTF-8编码文件,是否使用平台相关的换行符?

Python 打印到UTF-8编码文件,是否使用平台相关的换行符?,python,text,utf-8,newline,codec,Python,Text,Utf 8,Newline,Codec,在Python中,使用平台相关换行符写入UTF-8编码文件的最佳方式是什么?理想情况下,该解决方案在Python2中进行大量打印的程序中可以非常透明地工作。(也欢迎提供有关Python 3的信息!) 事实上,写入UTF-8文件的标准方式似乎是。然而,文件表明: (…)在读写时没有自动转换“\n” 因为文件实际上是以二进制模式打开的。那么,如何使用适当的平台相关换行符写入UTF-8文件呢 注意:在Windows XP上,使用Python 2.6的“t”模式(codecs.open('name.tx

在Python中,使用平台相关换行符写入UTF-8编码文件的最佳方式是什么?理想情况下,该解决方案在Python2中进行大量打印的程序中可以非常透明地工作。(也欢迎提供有关Python 3的信息!)

事实上,写入UTF-8文件的标准方式似乎是。然而,文件表明:

(…)在读写时没有自动转换“\n”

因为文件实际上是以二进制模式打开的。那么,如何使用适当的平台相关换行符写入UTF-8文件呢


注意:在Windows XP上,使用Python 2.6的“t”模式(codecs.open('name.txt,'wt'))似乎确实可以完成这项工作,但这是否有文档记录并保证可以正常工作?

您正在寻找
os.linesep

假设Python 2.7.1(这是您引用的文档):“wt”模式没有文档记录(文档记录的唯一模式是“r”),并且不起作用——编解码器模块在模式后附加“b”,这会导致其失败:

>>> f = codecs.open('bar.txt', 'wt', encoding='utf8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\python27\lib\codecs.py", line 881, in open
    file = __builtin__.open(filename, mode, buffering)
ValueError: Invalid mode ('wtb')
更新关于Python 3.x:

似乎codecdes.open()也有同样的缺陷(不会编写特定于平台的行终止符)。但是,内置的open()具有
编码
arg,它很乐意这样做:

[Python 3.2 on Windows 7 Pro]
>>> import codecs
>>> f = codecs.open('bar.txt', 'w', encoding='utf8')
>>> f.write('line1\nline2\n')
>>> f.close()
>>> open('bar.txt', 'rb').read()
b'line1\nline2\n'
>>> f = open('bar.txt', 'w', encoding='utf8')
>>> f.write('line1\nline2\n')
12
>>> f.close()
>>> open('bar.txt', 'rb').read()
b'line1\r\nline2\r\n'
>>>
更新关于Python 2.6

这些文档与2.7文档的内容相同。不同之处在于,在2.6中,将“b”附加到模式参数的“bludgeon to binary mode”黑客攻击失败,因为“wtb”未被检测为无效模式,文件是以文本模式打开的,并且似乎可以按照您的要求工作,而不是按照文档所述:

>>> import codecs
>>> f = codecs.open('fubar.txt', 'wt', encoding='utf8')
>>> f.write(u'\u0a0aline1\n\xffline2\n')
>>> f.close()
>>> open('fubar.txt', 'rb').read()
'\xe0\xa8\x8aline1\r\n\xc3\xbfline2\r\n' # "works"
>>> f.mode
'wtb' # oops
>>>

在Python 2中,为什么不显式编码

with open('myfile.txt', 'w') as f:
    print >> f, some_unicode_text.encode('UTF-8')

嵌入的换行符和由
print
发出的换行符都将转换为相应的平台换行符。

@eyquem:两者都有,但尤其是Python 2,因为这是我大部分时间使用的版本。:)@约翰:谢谢。Python3方法非常好。至于Python2方法,对于包含大量输出的程序来说,这是一个真正的难题。奇怪的是,codecdes.open()在Windows上与我的Python 2.6的“wt”一起工作…@EOL:请参阅我的最新更新re 2.6。也许你可以通过一个包装器来避免“真正的痛苦”…@约翰:最好在你的Python 2解决方案中提到
f=codecs.getwriter(“utf-8”)(f)
,因为问题是“一个需要大量打印的程序”,因此,打印时自动编码很有用。@John:您认为有什么理由在Python 3中使用
codecs.open()
而不是
open()??(2) 无用的向后兼容uselessA打印战利品是在程序中完成的,所以我希望看到一个轻量级的解决方案。另外,我想知道是否可以保证文本模式在某些平台上不会截断为7位…
with open('myfile.txt', 'w') as f:
    print >> f, some_unicode_text.encode('UTF-8')