Python UTF-16 CSV 阅读器

标签 python csv utf-16

我有一个必须阅读的 UTF-16 CSV 文件。 Python csv 模块似乎不支持 UTF-16。

我正在使用 python 2.7.2。我需要解析的 CSV 文件很大,有几 GB 的数据。

下面是 John Machin 问题的答案

print repr(open('test.csv', 'rb').read(100))

输出内容只有 abc 的 test.csv

'\xff\xfea\x00b\x00c\x00'

我认为 csv 文件是在美国的 Windows 机器上创建的。我正在使用 Mac OSX Lion。

如果我使用 phihag 提供的代码和包含一条记录的 test.csv。

使用的示例 test.csv 内容。下面是 print repr(open('test.csv', 'rb').read(1000)) 输出

'\xff\xfe1\x00,\x002\x00,\x00G\x00,\x00S\x00,\x00H\x00 \x00f\x00\xfc\x00r\x00 \x00e\x00 \x00\x96\x00 \x00m\x00 \x00\x85\x00,\x00,\x00I\x00\r\x00\n\x00'

phihag 代码

import codecs
import csv
with open('test.csv','rb') as f:
      sr = codecs.StreamRecoder(f,codecs.getencoder('utf-8'),codecs.getdecoder('utf-8'),codecs.getreader('utf-16'),codecs.getwriter('utf-16'))      
      for row in csv.reader(sr):
         print row

以上代码的输出

['1', '2', 'G', 'S', 'H f\xc3\xbcr e \xc2\x96 m \xc2\x85']
['', '', 'I']

预期输出是

['1', '2', 'G', 'S', 'H f\xc3\xbcr e \xc2\x96 m \xc2\x85','','I']

最佳答案

目前,csv 模块不支持 UTF-16。

在 Python 3.x 中,csv 需要一个文本模式文件,您可以简单地使用 open 的编码参数强制另一种编码:

# Python 3.x only
import csv
with open('utf16.csv', 'r', encoding='utf16') as csvf:
    for line in csv.reader(csvf):
        print(line) # do something with the line

在 Python 2.x 中,您可以重新编码输入:

# Python 2.x only
import codecs
import csv

class Recoder(object):
    def __init__(self, stream, decoder, encoder, eol='\r\n'):
        self._stream = stream
        self._decoder = decoder if isinstance(decoder, codecs.IncrementalDecoder) else codecs.getincrementaldecoder(decoder)()
        self._encoder = encoder if isinstance(encoder, codecs.IncrementalEncoder) else codecs.getincrementalencoder(encoder)()
        self._buf = ''
        self._eol = eol
        self._reachedEof = False

    def read(self, size=None):
        r = self._stream.read(size)
        raw = self._decoder.decode(r, size is None)
        return self._encoder.encode(raw)

    def __iter__(self):
        return self

    def __next__(self):
        if self._reachedEof:
            raise StopIteration()
        while True:
            line,eol,rest = self._buf.partition(self._eol)
            if eol == self._eol:
                self._buf = rest
                return self._encoder.encode(line + eol)
            raw = self._stream.read(1024)
            if raw == '':
                self._decoder.decode(b'', True)
                self._reachedEof = True
                return self._encoder.encode(self._buf)
            self._buf += self._decoder.decode(raw)
    next = __next__

    def close(self):
        return self._stream.close()

with open('test.csv','rb') as f:
    sr = Recoder(f, 'utf-16', 'utf-8')

    for row in csv.reader(sr):
        print (row)

opencodecs.open 要求文件以 BOM 开头。如果没有(或者您使用的是 Python 2.x),您仍然可以在内存中转换它,如下所示:

try:
    from io import BytesIO
except ImportError: # Python < 2.6
    from StringIO import StringIO as BytesIO
import csv
with open('utf16.csv', 'rb') as binf:
    c = binf.read().decode('utf-16').encode('utf-8')
for line in csv.reader(BytesIO(c)):
    print(line) # do something with the line

关于Python UTF-16 CSV 阅读器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9177820/

相关文章:

python - 如何管理 pandas 数据框中的特殊字符\r

python csv,只写一次标题

python - 使用 python 读取 csv 中的特定列

r - 如何创建 Shiny R 动态渲染表,其中多个表由上传的 CSV 文件确定?

string - UTF8 与 UTF16 与 char* 与什么?有人给我解释一下这个烂摊子!

python - numpy only 与 sklearn 之间 PCA 实现的差异

python - 如何读取一些文件数据并将其写入另一个文件?

python - 如何覆盖自定义模块的 ORM 方法取消链接?

c++ - 在 UTF-8 内部工作然后仅在 Windows 需要时才转换为 UTF-16 是否有任何危险?

java - Java 对 String 的内部表示是什么?修改过的UTF-8? UTF-16?