2009-07-09 45 views
3

我有一個UTF-8文件,其中一些行包含U + 2028行分隔符(http://www.fileformat.info/info/unicode/char/2028/index.htm)。當我讀取文件中的行時,我不希望它被視爲換行符。當我迭代文件或使用readlines()時,是否有辦法將它從分隔符中排除? (除了將整個文件讀入字符串,然後按\ n分割)。謝謝!如何在讀取文件時從Python的行分隔符中排除U + 2028?

+0

爲什麼不移動到U + 2028並丟棄CR/LF的恐龍? – 2014-12-11 16:38:26

回答

1

我不能在mac os上的python 2.5,2.6或3.0中複製此行爲x - U + 2028總是被視爲非終結線。你可以詳細瞭解你看到這個錯誤的地方嗎?

這就是說,這裏是「文件」類的子類,可能做你想要什麼:

#/usr/bin/python 
# -*- coding: utf-8 -*- 
class MyFile (file): 
    def __init__(self, *arg, **kwarg): 
     file.__init__(self, *arg, **kwarg) 
     self.EOF = False 
    def next(self, catchEOF = False): 
     if self.EOF: 
      raise StopIteration("End of file") 
     try: 
      nextLine= file.next(self) 
     except StopIteration: 
      self.EOF = True 
      if not catchEOF: 
       raise 
      return "" 
     if nextLine.decode("utf8")[-1] == u'\u2028': 
      return nextLine+self.next(catchEOF = True) 
     else: 
      return nextLine 

A = MyFile("someUnicode.txt") 
for line in A: 
    print line.strip("\n").decode("utf8") 
+0

有人更好的python unicode的知識,是這條線是正確的: `if nextLine.decode(「utf8」)[ - 1] == u'\ u2028':` 我得到一個警告沒有解碼聲明,跟着爲什麼。 – Markus 2009-07-09 21:28:52

+0

我不知道你得到了什麼樣的錯誤信息,但是通常如果這行包含非ASCII字符,那麼在它被任何其他操作處理之前,它必須首先解碼成'unicode字符串'。所以它通常是1.解碼,2.做東西的字符串,3.在寫入文件之前編碼,在處理utf文件時。 – user135773 2009-07-09 22:09:23

0

如果您使用Python 3.0(注意,我沒有,所以我無法測試),根據documentation你可以通過一個可選的newline參數open到specifify使用哪行分隔符。然而,這個文檔根本沒有提到U + 2028(它只提到\r,\n\r\n作爲行分隔符),所以對我來說這實際上讓我感到奇怪,甚至發生了這種情況(儘管我甚至可以用Python 2.6來證實這一點) 。

2

我無法重現這種行爲,但這是一個天真的解決方案,只是合併readline結果,直到它們不以U + 2028結尾。

#!/usr/bin/env python 

from __future__ import with_statement 

def my_readlines(f): 
    buf = u"" 
    for line in f.readlines(): 
    uline = line.decode('utf8') 
    buf += uline 
    if uline[-1] != u'\u2028': 
     yield buf 
     buf = u"" 
    if buf: 
    yield buf 

with open("in.txt", "rb") as fin: 
    for l in my_readlines(fin): 
    print l 
1

感謝大家的回答。 我想我知道爲什麼你可能沒有能複製this.I剛剛意識到,如果我打開解碼文件時,在它發生:

f = codecs.open(filename, encoding='utf-8') 
for line in f: 
    print line 

如果該行不分離的u2028,我首先打開該文件,然後解碼各條線:

f = open(filename) 
for line in f: 
    print line.decode("utf8") 

(我使用Python 2.6 Windows上的文件原本utf16le應按然後將其轉換爲UTF-8)。

這非常有趣,我想我現在不會使用codecs.open :-)。

0

編解碼器模塊正在做正確的事情。 U + 2028被命名爲「LINE SEPARATOR」,註釋「可以用來明確表示這個語義」。所以把它當作線路分隔符是明智的。

據推測,創作者不會在沒有充分理由的情況下將U + 2028字符放在那裏......該文件是否也有u「\ n」?爲什麼你不想在U + 2028上劃線?