在Python中,在开始阅读

时间:2017-11-19 15:39:34

标签: python python-2.7 utf-8

我正在编写一个读取文件的过滤器(可能是stdin)并可能写入stdout。如果输入文件以字节顺序标记开头,我希望输出文件有一个,否则我不会。如果我打开一个BOM为utf-8的文件,那么我的程序读取的第一个字符是BOM(\uFEFF),这是我不想要的。如果我打开没有BOM utf-8-sig的文件,它会正确读取,但我无法判断是打开输出为utf-8(没有签名)还是{{1} },将使用签名标记启动文件。所以我想要做的是查看文件的第一个字符,并根据其值决定用于打开文件的编码。如果它是一个磁盘文件,我可以简单地关闭它并重新打开它,但因为它可能是stdin我不能这样做。我可以通过让程序检查它读取的第一个字符来解决它,如果它是一个签名标记就输出它,但我想知道是否有更好的方法。我观察到如果我打开文件

utf-8-sig

然后执行f = io.open(inFile, encoding="utf-8", buffering=1) 我返回一个带有文件第一个字符的Unicode对象。这似乎很奇怪,因为我期望来自f.buffer.peek(1)的缓冲区peek(类的iobase将是一个长度为1的Unicode对象。现在我可以查看第一个字符是什么peek返回,如果是签名标记,则读取一个字符并将其写入输出,或丢弃它然后用peek()打开输出文件,但我不是真的喜欢基于这样的解决方案观察到的很多,而不是记录在案的行为。

任何想法如何做到这一点?

[我通过解析逻辑忽略BOM来解决这个问题。]

我还发现当我打开输出

utf-8-sig

我在每行(fOut = io.open(sys.stdout.fileno(), mode="at", encoding="utf-8", closefd=False) )的末尾得到一个额外的<CR>,如果我打开一个实际的文件,我将无法获得。

我尝试使用mode =&#34; ab&#34;这不起作用。似乎有用的是添加换行符=&#34; \ n&#34;:

<CR><CR><LF>

我认为这个&#34;工作的原因&#34;是因为同样的异常。编码时应该使用LF作为终结符。事实上,如果你用UNIX行终止符输入它,它仍会输出DOS行终止符。

我在Windows 10上运行Python 2.7.13。

感谢。

加里

0 个答案:

没有答案